转自 http://hi.baidu.com/liuhuachao/item/2ec163a8dd9756f515329bda
一、抽象类(abstract class):
1、 抽象类是特殊的类,只是不能被实例化,除此之外,具有类的其他特性;
2、抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类;
3、具体派生类必须覆盖基类的抽象方法;4、抽象方法只作声明,而不包含实现,可以看做没有实现体的虚方法;
5、抽象类可以派生自另一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如不覆盖,则其派生类必须覆盖它们。
二、接口(interface):
1、接口是引用类型的,类似于抽象类,不能被实例化;2、成员可以包含方法、属性、索引器和事件;
3、接口中不能包含常量、字段、构造函数、析构函数或静态成员;4、派生类必须实现接口的所有成员;
5、接口中的所有成员默认为public,因此接口中不能有private修饰符;6、一个类可以直接实现多个接口,接口之间用逗号隔开。
三、抽象类和接口的相同点:
1、都可以被继承;2、都不能被实例化;3、都可以包含方法声明;4、派生类必须实现未实现的方法。
四、抽象类和接口的区别:
1、抽象类是一个特殊的类,而接口只是一个行为的规范或规定;
2、抽象基类可以定义字段、属性、和方法实现。接口只能定义属性、索引器、事件和方法声明,不能包含字段;
3、抽象类更多的是定义在一系列紧密相关的类之间,而接口大多数是定义在关系疏松但都实现某一功能的类中;
4、接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;5、抽象类不能被密封。
6、一个类一次可以实现若干个接口,但是只能扩展一个父类;7、接口可以用于支持回调,而继承并不具备这个特点;
8、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的;
9、接口与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。
10、如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。
五、抽象类和接口的使用:
1、 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本;
2、如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口;
3、如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类;
4、抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。