C#知识总结之abstract class与interface
抽象类和接口在软件开发中用的是很频繁的,所以结合手上有的资料进行了以下的总结:
1.抽象类(abstract class)
抽象类是一种特殊的类,有如下的特点:
.抽象方法制作声明,不包含具体的实现,可以看做是没有重写的虚方法.
.抽象类不能被实例化.具有其他类相同的特性.
.抽象类可以没有抽象方法和抽象属性,但是一旦有了抽象方法,就一定要把这个类声明为抽象类.
.具体派生类必须要覆盖基类的抽象方法.
.抽象类可以派生自另一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果覆盖,则其他派生类也必须覆盖他们.
2.接口(interface)
接口是引用类型的,类似抽象类但又不同于抽象类.
.不能被实例化.
.只能包含实现的方法声明.
.成员可以包括方法,属性,索引器和事件.
.接口中不能包含常量,字段(域),构造函数,析构函数或者静态成员.
.接口中的所有成员默认为是public,因此接口中不能有private修饰符.
.派生类必须实现接口中的所有成员.
.一个类可以直接实现多个接口,接口之中用逗号隔开.
.一个接口可以有多个父接口,实现该接口的类必须实现所有接口中的所有成员.
3.抽象类和接口的区别
.都可以被继承.
.都不能被实例化.
.都可以包含方法声明.
.派生类必须要实现未实现的方法.
4.抽象和接口的区别
.抽象类是一个不完整的类,需要进一步细化,而接口只是一个行为的规范或规定,微软的自定义接口总是带able字段,证明其是表述一类"我能做...".
.抽象类可以定义字段,属性和方法实现.接口只能定义属性,索引器,事件和方法声明,不能包含字段.
.抽象类更多的是定义在一系列紧密相关的类之间,而接口大多数是定义在关系疏松但是都实现某一功能的类中.
.接口基本上不具备继承的任何具体特点,他仅仅承诺了能够调用的方法.
.接口可以被多重实现,抽象类只能被单一继承.即一个类一次可以实现多个接口,但是只能继承与一个父类.
.接口可以用于支持回调,而继承并不具备这个特点.
.抽象类不能被密封.
.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,也可以声明为虚的.
.接口与非抽象类类似.抽象类也必须为在该类的基类列表中列出的接口的所有成员提供他自己的实现.但是,允许抽象类将接口方法映射到抽象方法上.
.如果抽象类实现接口,则可以把接口中的方法映射到抽象类中作为抽象方法而不必实现,而在抽象类中的子类中实现接口中的方法.
5.抽象类和接口的使用
.抽象类主要用于关系密切的对象;而接口用于为不相关的类提供通用功能.
.如果要设计大的功能单元,则使用抽象类;如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类.
.如果创建的功能将在大范围的全异对象间使用,则使用接口.如果要设计笑而简练的功能块,则使用抽象类.
.如果预计要创建组件的多个版本,则创建抽象类.抽象类提供简单的方法来控制组件版本.
.好的接口定义应该是具有专一功能性的,而不是多功能的,否则会造成接口污染.如果一个类只是实现了这个接口中的一个功能,而不得去实现接口中的其他方法,那么就叫接口污染.
.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合.因为继承的层次增多,造成最直接的后果就是当你调用这个类群中的某个类时,就必须把他们全部加载到栈中!后果可想而知了.同时,可以留意到微软在构建一个类时,很多都是时候都是用到对象组合的方法.例如:asp.net中的Page类,有Server,Request等属性,但其实他们都是某个类的对象.使用Page类的对象来调用另外的类的方法和属性,是一个非常基本的设计原则.