以前c++的时候大家用虚类,而没有接口的概念,因为c++是多根派生的。
C#变成了单根派生,一个类只能继承自一个父类,但可以继承于多个接口,其中的抽象类与接口之间有许多相同点。
首先说接口,接口的定义是包含一组虚方法的载体,是严格的CAN-DO关系,这个东西可以包含方法的声明但不能包含实现,CLR允许接口包含事件,属性,索引器,静态方法,静态字段,静态构造函数和常数,但是c#不允许接口包含任何静态成员,所以尽管CLR允许,但C#语言不支持。
然后是抽象类,抽象类的定义是提供多个派生类共享基类的定义,是严格的IS-A的关系。抽象类可以包含抽象方法,也可以包含具体的实现,抽象类也与接口一样不能被实例化。
在开发过程中我们会觉得这两个东西貌似很一样,实则不是这样子的,所有的类继承都必须遵循IS-A的关系,而接口的继承则遵循CAN-DO的关系。
他们的相同点:
1 都不能被实例化 都是通过继承实现他们的抽象方法
2 都是面向抽象编程的基础 是设计模式的基础
他们的不同点:
1 接口支持多继承 类是单根派生机制的
2 接口只声明 抽象类可以实现
3 接口是行为规范 抽象类是不完全的类 更注重家族的实现
4 接口可以用于支持回调 抽闲类不能实现回调 因为继承不支持
5 接口可以用于值类型 比如struct继承自接口 但是抽象类不可以
他们的应用场合
1 面向对象就是面向接口
2 抽象类用于组织关系密切的对象 是IS-A 接口更注重给多个不相关的类声明通用功能
3 接口多定义行为 抽象类多定义属性
4 接口不变 是永久的 在未来的不断变化的商业逻辑面前 接口是有增无减也无改的