C#中抽象类和接口的区别

面试中十有八九会问到的问题,整理下。

  抽象类 接口
区别

1.对类的抽象

2.具备继承的特点

3.单继承

4.用于关系密切的对象

5.抽象方法只能声明于抽象类中

6.不支持回调

1.定义一个行为规范

2.基本不具备继承的特点,仅仅承诺能够调用的方法

3.多实现

4.适合为不相关的类提供通用功能

5.除了包含方法外,还可以包含属性、索引器、事件,这些成员都被定义为公有。不能包含任何其他成员,如:常量、域、构造函数、析构函数、静态成员

6.支持回调

相同点

1.不能实例化

2.包含未实现的方法声明

3.派生类必须实现未实现的方法,抽象类是抽象方法,接口是所有成员

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 抽象类实现了oop中的一个原则:把可变的与不可变的分离。抽象类和接口就是定义不可变的部分,而把可变的交给子类去实现。
  • 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。  

在别的帖子看到的几个形象的比喻,摘录如下:

1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

posted on 2017-08-03 15:31  MojoJojo  阅读(142)  评论(0)    收藏  举报

导航