聊聊~接口和抽象類

先介紹一下抽象類和接口的概念
一、抽象類:
  抽象類是特殊的類,只是不能實例化,除此之外,具有類的其他特性。並且抽象類可以包含抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋他們。另外,抽象類可以派生自一個抽象類,可以覆蓋,也可以不覆蓋基類的抽象方法,但是它的派生類必須覆蓋他們。
  
二、接口:
它和抽象類有共同點,不能實例化、包含未實現的方法聲明、派生類必須實現未實現的方法,接口還可以包含屬性、索引器、事件,這些成員都被定義未公有的,不能有常量、域、構造函數、析構函數、靜態成員。
談兩個相似概念,就要放在一起,對比着說。

三、抽象類 VS 接口
1. 類是對,對象的抽象,可以理解爲把類當做對象,而接口只是一個行爲的規範或者規定。
2. 接口基本上不具備繼承的任何具體的特點,它僅僅承諾了能夠調用的方法。
3. 一個類可以實現若干接口,但是隻能擴展一個父類。
4. 接口可以用於支持回調,而繼承不具備這個特點。
5. 抽象類的實現的具體方法默認是虛的,但接口的方法默認非虛。
6. 如果抽象類的實現接口,則可以把接口中方法映射到抽象類中作爲抽象方法而不必實現,二組抽象類的子類中實現接口中方法。
7. 抽象類和接口實現了OOP中的一個原則,把可變的與不可變的分離,抽象類和接口就是定義爲不可變的,把不可變的作爲子類去實現。

四、應用場景:

抽象類:

  1. 如果想創建組件的多個版本,則創建抽象類,抽象類提供簡單的方法來控制組件版本。
  2. 如果要設計大的功能單元,則使用抽象類。
  3. 如果要在組件的所有實現間提供通用的已實現的功能,則使用抽象類。

接口:
4. 如果創建的功能將在大範圍的全局對象間使用,則使用接口。
5. 如果要設計小而簡練的功能塊,則使用接口。

一句話,抽象類主要用於關係密切的對象,而接口適合爲不相關的類提供通用功能。

分享一下大師的比喻:
1. 飛機會飛,鳥會飛,他們都繼承同一個接口 “飛”,但是F22屬於飛機抽象類,鴿子屬於鳥抽象類。
2. 就像鐵門,木門都是門(抽象類),你想要個門,我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態),而且只能是門,你不能說他是窗(單繼承),一個門可以有鎖(接口),也可以有門鈴(多實現)。門(抽象類)定義了你是什麼,接口(鎖)規定了你能做什麼(一個接口最好只能叢一件事,你不能要求鎖也能發出聲音吧(接口污染))。

PS:接口污染——> 一個類只是實現這個接口中的一個功能,而不得不去實現接口中的其他方法,就叫接口污染。

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