抽象类与接口的功能有很类似的地方,接口可以认为是一种更加"抽象"的抽象类.他们都可以认为是提供一个可被继承并重写的方法的集合,但是在C# 中他们的用法有几点差别.
抽象类是类,而接口是接口! 这句貌似是废话的话其实应该可以说明他们之间区别的根本原因了.抽象类说到底是类,只不过它包含了抽象方法,它具有一个实例类所具有的一切特征.而接口是高度抽象的类,他跟一个实例类是有很大的不同.
1.抽象类支持实例方法,这对于类来说一点都不奇怪,但是高度抽象的接口是不可能包含实例方法的.
2.抽象类无法支持多继承,这也是C# 中类的特点,但是接口则不然.
3.抽象类可以声明并使用变量,但是接口则不可以.因为它是高度抽象的.但是值得注意的一点是接口中允许有抽象的属性,因为属性是方法而不是变量.
4.抽象类的方法允许有多种访问修饰符,这也是类的特征,但是接口默认的访问修饰符都是public而且在C# 语法中,接口成员之前的修饰符是不容许出现的,即便是public也不例外,这个道理也很简单,接口中的方法都是虚拟的,如果无法被其他类来继承并重写,这个方法就永远无法被使用到,声明这样的一个方法根本就是画蛇添足的.
5.抽象类可以定义构造函数,但是接口则不可以.这个可以从两方面来理解,接口中不允许有实例方法,而构造函数必须是实例方法;接口中的方法都是虚拟的,即便是有一个构造函数,它的作用又来构造谁呢?