C#中抽象类和接口的区别
面试中十有八九会问到的问题,整理下。
抽象类 | 接口 | ||
区别 |
1.对类的抽象 2.具备继承的特点 3.单继承 4.用于关系密切的对象 5.抽象方法只能声明于抽象类中 6.不支持回调 |
1.定义一个行为规范 2.基本不具备继承的特点,仅仅承诺能够调用的方法 3.多实现 4.适合为不相关的类提供通用功能 5.除了包含方法外,还可以包含属性、索引器、事件,这些成员都被定义为公有。不能包含任何其他成员,如:常量、域、构造函数、析构函数、静态成员 6.支持回调 |
|
相同点 |
1.不能实例化 2.包含未实现的方法声明 3.派生类必须实现未实现的方法,抽象类是抽象方法,接口是所有成员 |
- 抽象类实现了oop中的一个原则:把可变的与不可变的分离。抽象类和接口就是定义不可变的部分,而把可变的交给子类去实现。
- 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
在别的帖子看到的几个形象的比喻,摘录如下:
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。