.net接口和抽象类的相同点和不同点
相同点:
都不能直接被实例化,都可以通过继承实现其抽象方法。
都是面向抽象编程的技术基础,实现了诸多的设计模式。
不同点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
接口可以用于支持回调;抽象类不能实现回调,因此继承不支持。
接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,struct就可以继承接口,而不能继承类。
抽象类应主要用于关系密切的对象,而接口最适合威不想关的类提供通用功能。
接口注重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系;
接口多定义对象的行为;抽象类多定义对象的属性;
接口定义科使用Public、protected、internal和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了;
“接口不变”是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。
尽量将接口设计成功能单一的功能块,以.net Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只只包含一个公共方法。
接口名称前面的大些字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。
在接口中,所有的方法都默认为public.
如果预计会出现版本问题,可以创建“抽象类”。例如:创建了狗(dog)、鸡(Chicken)和鸭(duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所派生类,并重新编译,所以版本式的问题最好以抽象类来实现。
抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。
对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。
在抽象方法声明中不能使用static或virtual修饰符。