1、基本概念介绍
抽象类:
1.抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法
2.抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类
3.具体派生类必须覆盖基类的抽象方法
4.抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。
5.抽象类不能被实例化
接口:
1.接口不能被实例化
2.接口只能包含方法声明
3.接口的成员包括方法、属性、索引器、事件
4.接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。
5.接口中的所有成员默认为public,因此接口中不能有private修饰符
6.派生类必须实现接口的所有成员
7.一个类可以直接实现多个接口,接口之间用逗号隔开
8.一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员。
相同点:
1、都可以被继承
2、都不能被实例化
3、都可以包含方法声明
4、派生类必须实现未实现的方法
区别:
1、抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
2、接口可以被多重实现,抽象类只能被单一继承
3、抽象类是一个不完整的类,需要进一步实现(继承,并实现方法)。接口是一个行为规范,可以直接继承引用
4、接口基本不具备继承的特性,仅仅能够调用而已。
5、接口可以用于支持回调,而继承并不具备这个特点。
如果抽象类中实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口方法
目标 | 选择 |
创建多个组件版本 | 抽象类 |
设计小而简练的功能块 | 接口 |
设计大型功能单元 | 抽象类 |
2、abstract class和interface的使用场景
1、首先来理解一下抽象类。在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去 不同,但是本质上相同的具体概念的抽象。比如我们xpads 项目中的交易类就可以理解为一个抽象类,即期交易、远期交易、掉期交易等都是继承交易类的具体类。即期交易、远期交易、掉期交易这些具体概念是实际存在的,而交易这个概念在问题领域中是不存在 的,可以理解为一个抽象概念。正是因为抽象概念在实际问题领域中没有东西与它对应,所以用以表征抽象概念的抽象类是不能被实例化的。
2、接下来理解一下接口,接口是面向对象设计中的一组规范,是一组方法的集合体(也可以定义一些常量),在一些软件设计模式中提倡的面向接口编程,其实就是屏蔽实现类的内部处理,增强模块的安全性、灵活性,达到软件设计的高内聚、松耦合。
3、抽象类应用在具有相同特征和行为中,可以有实现的方法,可实现复用,接口更多的是一种行为定义,不能有实现成员。