【原创】C#中的抽象类(abstract class)和接口(interface)的比较
在C#中抽象类和接口是两个相当重要的概念,深入理解对C#程序员是非常必要的,现总结如下:
一、抽象类的特点:
1、抽象方法只用于方法的声明并不包含方法的实现,可以看作没有实现实体的虚方法。
2、抽象类不能进行实例化。
3、抽象类里面可以不包含抽象属性和抽象方法,但如果包含抽象方法,则该类必须声明为抽象类。
4、具体的派生类必须覆盖基类的抽象方法。
5、抽象类也可以派生另一个抽象类,其中可以覆盖基类的抽象方法也可以不用覆盖,但是不覆盖的话,
则其派生类比较覆盖它们。
二、接口(interface)的特点
1、接口也不能进行实例化。
2、接口只能包含类的声明。
3、成员可以包含属性、方法、事件和索引器。
4、接口中不能包含常量、字段、构造函数、析构函数或静态成员。
5、接口 中所有的成员都默认用public修饰符进行修饰,不能出现private修饰符。
6、派生类比较实现接口所有的成员。
7、一个可以继承多个接口,接口之间用 , 分割。
8、一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员。
三、抽象类和接口的相同之处
1、都不能被实例化。
2、都可以被继承。
3、都可以包含方法声明。
4、派生类必须实现抽象类(接口)中未实现的方法。
四、抽象类和接口的不同之处
1、抽象类是一个不完整的类,需要进一步细化;接口只是一个行为的规范或规定。
2、抽象基类可以定义字段、属性和方法实现;接口只能定义属性、索引器、事件和方法声明,不能包含字段。
3、抽象类更多的是定义在一系列关系紧密的类之间;接口大多定义在关系稀松但都实现某一功能的操作。
4、接口不具有继承的任何特点。
5、接口可以被多重实现,抽象类只能被单一继承。
6、接口支持回调,抽象类不可以。
7、抽象类不能密封。
8、抽象类实现的具体方法默认为虚的;但实现接口的类中的接口方法默认不是虚的,当然也可手动声明为虚的。
9、接口和非抽象类类似,抽象类必须为在该类的基类列表中列出的接口的所有成员提供他自己的实现。但是允许抽象类将接口的方法隐射到抽象方法上。
10、如果抽象类实现接口,则可以把接口中的方法映射到抽象类中作为抽象方法而不必实现,而是在抽象类的子类中实现接口中的方法。