1.概念
抽象类:首先抽象类是类的概念,描述的是“是什么”。除了具有类的所有特性之外,它还有自己独特的性质(这里讲的是抽象类和类的区别了):只有抽象类中才可以有抽象方法,实体类中不能定义抽象方法;抽象类不能被封闭(sealed),必须可以被其它类继承;派生出来的实体类必须实现抽象类中定义的抽象方法,当然如果派生出来的类依然是实体类,则可以不实现。
接口:接口是引用类型的一种,描述的是“能做什么”。接口的特性:接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
2.相同点在哪里
*都可以被继承
*不能实例化;
*包含未实现的方法声明;
*派生出来的实体类类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
3.区别在哪里
*接口支持多继承;抽象类不能实现多继承。
*接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
*接口可以用于支持回调;抽象类不能实现回调
*接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
*接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,struct就可以继承接口,而不能继承类。
*抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做...”
4.区别它们的意义在哪里
我们之所以要区分它们,是因为它们是面向对象设计的基础,它们在面向对象设计中起着举足轻重的作用,很多设计模式都是用它们来实现的。以Template模式为例,我们要定义一组方法的执行顺序,这里只能选择抽象类,而不是接口,代码如下:
public abstract class DemoProcess
{
public abstract void Init();
public abstract void Cleanup();
public void Run()
{
Init();
Cleanup();
}
}
由于抽象类和和接口之间在对于抽象定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意,这是一个很不好的习惯,我们应该有一些规则来约束对它们的使用:
使用规则:
1、抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能
2、如果要设计大的功能单元,则使用抽象类;如果要设计小而简练的功能块,则使用接口。
3、如果预计要创建组件的多个版本,则创建抽象类。接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
4、如果创建的功能将在大范围的全异对象间使用,则使用接口;如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
5、分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”。为外部提供调用或功能需要扩充时优先使用接口
6、好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染
7、尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们 全部加载到栈中!后果可想而知。(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如 asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则
分享到:
相关推荐
好啊好啊 抽象类与接口是Java中最重要部分之一,这里用较大的篇幅来做下这部分的笔记. 1. final关键字 在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记...
转载的文章,很好很强大。结合实例探讨了抽象类与接口使用上需要注意的地方。
(3) 继承抽象类的类在类中必须实现抽象类中的抽象方法。 (4) 抽象类中可以有抽象方法,也可有非抽象方法。抽象方法不能为private。 (5) 间接继承抽象类的类可以不给出抽象方法的定义。 6、 final关键字 (1) 一个...
接口(interface)是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法实现。 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法...
抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型...
从封装、继承、多态、接口、内部类、抽象类和代码块 适合刚开始的新手参考,毕竟我也是自学的 主要可以使用在计算机刚入门的小伙伴或者回来看一看复习一下简单的基础的 ① 凡本网站注明“来源:本网站、子网站或相关...
经常以那些技术只适合大型项目为由,避开或忽略它们,实际中,Java 的接口或抽象类是真正体现 Java 思想的核心所在,这些 你都将在 GoF 的设计模式里领略到它们变幻无穷的魔力。 GoF 的设计模式表面上好象也是一种...
如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1....
如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1....
那么,我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现,下面就是将上例中的Factory拓展成抽象工厂: public abstract class Factory{ public abstract Sample creator(); ...
与 二进制 √(vs2005097) 106. 多文件上传 √(vs2005098) <br/>创建可复用的代码 107. 创建可复用的代码 – 概述√(vs2005099) 108. 深入继承 – 抽象类和接口 一 √(vs2005100) 109. 深入继承...
与 二进制 √(vs2005097) 106. 多文件上传 √(vs2005098) <br/>创建可复用的代码 107. 创建可复用的代码 – 概述√(vs2005099) 108. 深入继承 – 抽象类和接口 一 √(vs2005100) 109. 深入继承...
与 二进制 √(vs2005097) 106. 多文件上传 √(vs2005098) <br/>创建可复用的代码 107. 创建可复用的代码 – 概述√(vs2005099) 108. 深入继承 – 抽象类和接口 一 √(vs2005100) 109. 深入继承...
C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用...
①自己想总结一篇同时包含质与量的文章,给自己,也给关注我的人。 ②最近在投递实习,所以主要都是Java的基础知识,计算机网络和操作系统就只挑重点,本文后面视情况会继续更新。以后可能会完善包括数据结构和算法...
(65) 软件设计包括软件的结构、数据接口和过程设计,其中软件的过程设计是指(B) 注:P73 A. 模块间的关系 B. 系统结构部件转换成软件的过程描述 C. 软件层次结构 D. 软件开发过程 (66) 为了避免流程图在描述程序逻辑...
这个类是公用一个类,详细的类CLoad3DS的接口信息可以到一个open source项目里参考。http://scourge.sourceforge.net http://scourge.sourceforge.net/api/3ds_8h-source.html 实际上在使用这个类时候,我做了一些...