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类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则
分享到:
相关推荐
接口(interface)是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法实现。 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法...
抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型...
#### 五、面向接口编程与抽象类 **5.1 接口与抽象类** - 当不确定类的具体实现细节时,优先选择定义接口。 - 抽象类适合于提供部分实现,而具体实现留给子类完成。 - 在设计时考虑未来可能的变化,以便于扩展而不...
从封装、继承、多态、接口、内部类、抽象类和代码块 适合刚开始的新手参考,毕竟我也是自学的 主要可以使用在计算机刚入门的小伙伴或者回来看一看复习一下简单的基础的 ① 凡本网站注明“来源:本网站、子网站或相关...
面试官可能会询问抽象类和接口的区别,方法的重写和重载,以及如何利用多态优化代码。 日期和时间的处理是Java程序中常见的需求。早期的java.util.Date和Calendar类由于设计复杂,现在已经推荐使用java.time包下的...
4. **访问标志**:标识类或接口的访问权限和特性,如是否是公共类、是否是抽象类等。 5. **类索引、父类索引和接口索引列表**:指明类的全限定名、其父类和实现的接口。 6. **字段表集合**:列出类或接口的所有...
1. **Creator(创建者)**:包含创建产品对象的工厂方法,它可以是抽象类或接口。 2. **Product(产品)**:是工厂方法创建的所有对象的基类,它指定了这些对象所具有的公共接口。 3. **ConcreteProduct(具体产品)...
7. 抽象类与派生类的输出:这个例子展示了构造函数的调用顺序和方法重写。`A`类的构造函数会打印'A',而`B`类的构造函数会打印'B'。`Fun`方法在`B`类中被重写,但`Main`方法中调用的是`A`类的`Fun`,因为它是虚拟的...
- C#支持所有主要的面向对象概念,如封装、继承、多态和抽象类。 - 通过接口,C#实现了多态性,允许类实现多个接口,而不仅仅是单继承。 - 类和接口的定义使得代码组织有序,提高了代码的可复用性和可维护性。 4...
- 抽象类与接口:理解两者的区别和使用场景。 - 代码优化:平衡性能与可读性,使用适当的编程技巧和工具。 - 多态与委派:在面向对象编程中,多态提供了动态绑定,委派用于委托任务给其他对象。 5. **算法与数据...
4. **Java应用程序接口(Java API)**:这是Java的标准库,包含了大量预定义的类和接口,可以帮助开发者快速构建应用程序。 这四个组成部分共同构成了Java平台的基础。开发人员编写的源代码文件(`.java`文件)会被...
Action类是Struts2的核心,它继承自`ActionSupport`类或实现`Action`接口。当一个HTTP请求到达时,Struts2的Dispatcher Servlet(StrutsPrepareAndExecuteFilter)会拦截请求,根据配置文件(struts.xml)找到对应的...
5. **Java 内部 DSL**:如何利用 Java 的类、接口和方法来构造内部DSL,让代码更易读、易维护。 6. **解析库的使用**:如ANTLR、JavaCC等解析库的工作原理和使用方法,以及它们如何简化解析器的开发。 7. **界面...
经常以那些技术只适合大型项目为由,避开或忽略它们,实际中,Java 的接口或抽象类是真正体现 Java 思想的核心所在,这些 你都将在 GoF 的设计模式里领略到它们变幻无穷的魔力。 GoF 的设计模式表面上好象也是一种...
接口编程是OOP的一个重要方面,通过接口,程序员可以编写与实现细节分离的代码。 泛型编程是C++的另一大特色,主要由模板机制实现。模板允许在编译时创建针对不同类型的函数和类,实现泛型代码,增强了代码的复用性...
客户程序与抽象类的实现部分之间存在很大的依赖性时;当你需要构建一个层次结构的子系统时。 6. 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。 适用场景:系统中存在大量的相似对象,这些对象...
Java中的`java.io.File`类是用于表示文件和目录路径名的抽象表示。它提供了许多操作,如创建、删除、重命名文件和目录,以及获取文件属性等。 2. **路径构造**: 可以通过传递字符串参数给File构造器来创建一个...
如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1....