面向對象的特點之一就是抽象,說道抽象就不得不提一下抽象類和接口,那麼抽象類和接口是什麼、又有什麼關系和區別?讓我們來探討一下。
首先看一下百度百科的解釋:
抽象類:面向對象中,所有對象都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
接口:程序接口,由一套陳述、功能、選項、其它表達程序結構的形式、以及程序師使用的程序或者程序語言提供的數據組成。
定義方法:
抽象類:
接口:
定義時需要注意的:
1)抽象類中含有抽象方法,定義時必須用abstract關鍵字修飾,且抽象類不能實例化。
2)抽象類中可以包含非抽象的普通方法及構造方法;接口中的所有方法必須是抽象的。
3)抽象類中的抽象方法的訪問類型可以是public,protected;接口中的抽象方法只能是public類型的,並且默認即為public abstract類型。
4)抽象類中可以包含靜態方法;接口中不能包含靜態方法。
我的理解:
1)抽象類可以提供方法的具體實現,當抽象類的子類繼承抽象類之後,會得到這些方法;接口只能提供方法名稱而不能夠寫出具體實現,如果寫出具體實現,實現接口的類在編譯階段就會報錯,換句話說,實現接口的類都要寫一遍接口方法的實現。
2)由於C#中的單繼承,一個類只能繼承一個抽象類,一個類作為類型定義工具是有局限性的;而對於接口就不一樣的,C#中允許一個類實現多個接口,而多個接口可以是不同類型的,所以實現多個接口的類就能有了多種類型。
3)接口把“做什麼”和“怎麼做”分開了,這就是實現了解耦合,具體是解了方法和實現方法的類之間的耦合,這給程序的可維護性增強了,這是接口的一大好處。
4)簡單來說,接口是public的,是讓別人使用的,所以接口不能有私有的屬性和方法;抽象類可以有私有屬性和方法。
5)抽象類之所以稱作抽象類,是因為其中有抽象方法,而且抽象方法必須由abstract關鍵字修飾;接口中的方法就不需要關鍵字來修飾。
6)在缺省適配模式中,將接口放在頂層,下邊為抽象類,可以同時結合接口和抽象類的優點,方便使用。
小結:抽象類和接口一定程度上具有相似性,在實際學習中我們要對比著去學習。