抽象類別和介面在軟體開發中用的是很頻繁的,所以結合手上有的資料進行了以下的總結:
1.抽象類別(abstract class)
抽象類別是一種特殊的類,有如下的特點:
.抽象方法製作聲明,不包含具體的實現,可以看做是沒有重寫的虛方法.
.抽象類別不能被執行個體化.具有其他類相同的特性.
.抽象類別可以沒有抽象方法和抽象屬性,但是一旦有了抽象方法,就一定要把這個類聲明為抽象類別.
.具體衍生類別必須要覆蓋基類的抽象方法.
.抽象類別可以派生自另一個抽象類別,可以覆蓋基類的抽象方法也可以不覆蓋,如果覆蓋,則其他衍生類別也必須覆蓋他們.
2.介面(interface)
介面是參考型別的,類似抽象類別但又不同於抽象類別.
.不能被執行個體化.
.只能包含實現的方法聲明.
.成員可以包括方法,屬性,索引器和事件.
.介面中不能包含常量,欄位(域),建構函式,解構函式或者靜態成員.
.介面中的所有成員預設為是public,因此介面中不能有private修飾符.
.衍生類別必須實現介面中的所有成員.
.一個類可以直接實現多個介面,介面之中用逗號隔開.
.一個介面可以有多個父介面,實現該介面的類必須實現所有介面中的所有成員.
3.抽象類別和介面的區別
.都可以被繼承.
.都不能被執行個體化.
.都可以包含方法聲明.
.衍生類別必須要實現未實現的方法.
4.抽象和介面的區別
.抽象類別是一個不完整的類,需要進一步細化,而介面只是一個行為的規範或規定,微軟的自訂介面總是帶able欄位,證明其是表述一類"我能做...".
.抽象類別可以定義欄位,屬性和方法實現.介面只能定義屬性,索引器,事件和方法聲明,不能包含欄位.
.抽象類別更多的是定義在一系列緊密相關的類之間,而介面大多數是定義在關係疏鬆但是都實現某一功能的類中.
.介面基本上不具備繼承的任何具體特點,他僅僅承諾了能夠調用的方法.
.介面可以被多重實現,抽象類別只能被單一繼承.即一個類一次可以實現多個介面,但是只能繼承與一個父類.
.介面可以用於支援回調,而繼承並不具備這個特點.
.抽象類別不能被密封.
.抽象類別實現的具體方法預設為虛的,但實現介面的類中的介面方法卻預設為非虛的,也可以聲明為虛的.
.介面與非抽象類別類似.抽象類別也必須為在該類的基類列表中列出的介面的所有成員提供他自己的實現.但是,允許抽象類別將介面方法映射到抽象方法上.
.如果抽象類別實現介面,則可以把介面中的方法映射到抽象類別中作為抽象方法而不必實現,而在抽象類別中的子類中實現介面中的方法.
5.抽象類別和介面的使用
.抽象類別主要用於關係密切的對象;而介面用於為不相關的類提供通用功能.
.如果要設計大的功能單元,則使用抽象類別;如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類別.
.如果建立的功能將在大範圍的全異對象間使用,則使用介面.如果要設計笑而簡練的功能塊,則使用抽象類別.
.如果預計要建立組件的多個版本,則建立抽象類別.抽象類別提供簡單的方法來控制組件版本.
.好的介面定義應該是具有專一功能性的,而不是多功能的,否則會造成介面汙染.如果一個類只是實現了這個介面中的一個功能,而不得去實現介面中的其他方法,那麼就叫介面汙染.
.盡量避免使用繼承來實現組建功能,而是使用黑箱複用,即對象組合.因為繼承的層次增多,造成最直接的後果就是當你調用這個類群中的某個類時,就必須把他們全部載入到棧中!後果可想而知了.同時,可以留意到微軟在構建一個類時,很多都是時候都是用到對象組合的方法.例如:asp.net中的Page類,有Server,Request等屬性,但其實他們都是某個類的對象.使用Page類的對象來調用另外的類的方法和屬性,是一個非常基本的設計原則.