什么是抽象类?
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。抽象类不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。
什么是接口?
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。
例子:飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
相同点: (1)都不能被直接实例化,都可以通过继承实现其抽象方法。
(2)都是面向抽象编程的技术基础,实现了诸多的设计模式。
不同点:(1) 接口支持多继承;抽象类不能实现多继承。 接口只能定义抽象规则;
(2)抽象类既可以定义规则,还可能提供已实现的成员。 接口是一组行为规范;
(3)抽象类是一个不完全的类,着重族的概念。 接口可以用于支持回调;
(4)抽象类不能实现回调,因为继承不支持。 接口只包含方法、属性、索引器、事件的签名,
但 不能定义字段和包含实现的方法;
(5)抽象类可以定义字段、属性、包含有实现的方法。 接口可以作用于值类型和引用类型;
(6)抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。
(7)抽象类有构造方法,接口却没有构造方法。
接口的应用场合:
类与类之前需要特定的接口进行协调,而不在乎其如何实现。
作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。
抽象类的应用场合:
一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:
定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能