关于接口与抽象类
接口与抽象类的区别总结一下,主要是摘自王涛的《你必须知道.Net》一书,在此感谢王涛老师。
1 相同点
1)都不能被直接实例化,都可以通过继承实现其抽象方法;
2)都是面向抽象编程的技术基础,实现了诸多的设计模式。
不同点:
1)接口支持多继承,抽象类不能实现多继承。严格意义上说,接口继承类应该称为类实现接口;
2)接口只能定义抽象规则;抽象类既可以定义规则,还可以提供已实现的成员;
3)接口是一组行为规范;抽象类是一个不完全的类,着重族的概念;
4)接口用于支持回调;因为继承不支持,所以抽象类在实现回调时有局限性。
接口可用作值类型与引用类型;抽象类只能用作引用类型。
接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性和包含的方法。
3 规则与场合
1)面向对象思想最重要的一个原则:面向接口编程;
2) 借助接口和抽象类,23个设计模式实现。简单的说,面向抽象编程,通过封装变化实现实体之间的关系;
3)抽象类主要用于关系密切的对象,而接口最适合为相关的类提供通用功能;
4) 接口着重于CAN-DO关系类型,而抽象类偏重于IS-A式的关系;
5) 接口多定义对象的行为;抽象类多定义对象的属性;
6) “接口不变”,是应该考虑的重要因素;
7) 在接口中,所有的方法默认为public;
8) 在抽象方法声明中,不能使用static或virtual修饰符。