1 接口可以多重继承,但是抽象类不可以; 接口为了实现系统中的松偶合.
2 抽象类与子类,是父子关系; 而接口则不是,是松偶合的关系.
3 抽象类能够定义方法的实现; 接口不能包含方法的实现。
4 最大的区别是由抽象类可以派生出一些成员的实现,但接口却不包含任何成员的实现
5 如果继承一个抽象类,当你类更新时,所有的子类都会跟着更新;而接口是一成不变的,一旦发布了一个接口,永远不要再更改它
6 少量的的接口
7 抽象类可以有实现的过程,而接口没有
8 抽象类可以重载
9 你只能继承一个抽象类,而接口被继承的同时还可以继承其它类和接口
10 接口:
接口可以有静态成员、嵌套类型、抽象、虚拟成员、属性和事件。实现接口的任何类都必须提供
接口中所声明的抽象成员的定义。接口可以要求任何实现类必须实现一个或多个其他接口。
对接口有以下限制:
接口可以用任何可访问性来声明,但接口成员必须全都具有公共可访问性。
不能向成员或接口自身附加安全性权限。
接口可以定义类构造函数,但不能定义实例构造函数。
每种语言都必须为需要成员的接口映射一个实现提供规则,因为不只一个接口可以用相同的签名声明成员,且这些成员可以有单独的实现
抽象类:
抽象类与接口紧密相关,它们不能示例化,并且常常部分实现或根本不实现。抽象类和接口之间的 一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。可以在创建组件时使用抽象类,因为它 们使您得以在某些方法中指定不变级功能,但直到需要该类的特定实现之后才实现其他方法。抽象类也制定版本,因为如果在派生类中需要附加功能,则可以将其添 加到基类而不中断代码。
11 接口是非常简单、原始的东西,例如没有设计传递性(IA应用IB,IC应用IA,但是IC并不具有IB接口,此时只能让IC额外应用IB接口),不能用来 复用代码流程等。如果你的类继承了接口IA,那么当IA稍有修改的时候,所有应用了IA的代码都会垮掉,必须重新写。
抽象类仅仅是因为有个别内容暂时决定不了,大部分内容还是在高层次就说清楚的用来继承的。如 果你在高层次就全是虚拟的,那么这个类是完全空洞的,此时机非常像接口了(尽管仍然比接口方便一些,例如具有设计传递性)。但是.net、java等不支 持多重继承,相比c++的能力要差很远。
功能强大的、面向逻辑、面向对象、具有现成的自动化控制逻辑的编程方式总是被只会琐碎、顺序 地编程的人妖魔化。只会c的人妖魔化c++,只会接口的人妖魔化继承,等等。其实任何东西都不是不必要的,你看java的各种系统、.net的类库,简单 看一下源代码到底哪些东西在对系统结构的实用性起关键作用,难道它们用接口来替代了继承了吗?
空洞的类没有什么价值,尽量设计有实质内容的类。这就在实用性、内容上与接口清楚地分开了。
但是很遗憾.net、java不支持多重继承,不得不用接口来勉强模拟。
传统的COM等标准也不支持多重继承。被逼无奈,那些开发世界上最实用、最赚钱的个人系统的应用大师(而不是那些书写各种规范的大学教授们)大量使用object类型,以便使用后期绑定的各种技巧来模拟只有多重继承才具有的功能。范型有点缓解这些object造成的问题。