聊聊~接口和抽象类

先介绍一下抽象类和接口的概念
一、抽象类:
  抽象类是特殊的类,只是不能实例化,除此之外,具有类的其他特性。并且抽象类可以包含抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖他们。另外,抽象类可以派生自一个抽象类,可以覆盖,也可以不覆盖基类的抽象方法,但是它的派生类必须覆盖他们。
  
二、接口:
它和抽象类有共同点,不能实例化、包含未实现的方法声明、派生类必须实现未实现的方法,接口还可以包含属性、索引器、事件,这些成员都被定义未公有的,不能有常量、域、构造函数、析构函数、静态成员。
谈两个相似概念,就要放在一起,对比着说。

三、抽象类 VS 接口
1. 类是对,对象的抽象,可以理解为把类当做对象,而接口只是一个行为的规范或者规定。
2. 接口基本上不具备继承的任何具体的特点,它仅仅承诺了能够调用的方法。
3. 一个类可以实现若干接口,但是只能扩展一个父类。
4. 接口可以用于支持回调,而继承不具备这个特点。
5. 抽象类的实现的具体方法默认是虚的,但接口的方法默认非虚。
6. 如果抽象类的实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,二组抽象类的子类中实现接口中方法。
7. 抽象类和接口实现了OOP中的一个原则,把可变的与不可变的分离,抽象类和接口就是定义为不可变的,把不可变的作为子类去实现。

四、应用场景:

抽象类:

  1. 如果想创建组件的多个版本,则创建抽象类,抽象类提供简单的方法来控制组件版本。
  2. 如果要设计大的功能单元,则使用抽象类。
  3. 如果要在组件的所有实现间提供通用的已实现的功能,则使用抽象类。

接口:
4. 如果创建的功能将在大范围的全局对象间使用,则使用接口。
5. 如果要设计小而简练的功能块,则使用接口。

一句话,抽象类主要用于关系密切的对象,而接口适合为不相关的类提供通用功能。

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

PS:接口污染——> 一个类只是实现这个接口中的一个功能,而不得不去实现接口中的其他方法,就叫接口污染。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章