1. 程式人生 > >介面和抽象類的異同點

介面和抽象類的異同點

什麼是介面? 
介面是包含一組虛方法的抽象型別,其中每一種方法都有其名稱、引數和返回值。介面方法不能包含任何實現,CLR允許介面可以包含事件、屬性、索引器、靜態方法、靜態欄位、靜態建構函式以及常數。但是注意:C#中不能包含任何靜態成員。一個類可以實現多個介面,當一個類繼承某個介面時,它不僅要實現該介面定義的所有方法,還要實現該介面從其他介面中繼承的所有方法。

什麼是抽象類?
抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能例項化,必須通過繼承由派生類實現其抽象方法,因此對抽象類不能使用new關鍵字,也不能被密封。如果派生類沒有實現所有的抽象方法,則該派生類也必須宣告為抽象類。另外,實現抽象方法由overriding方法來實現。


相同點 

都不能被直接例項化,都可以通過繼承實現其抽象方法。 
都是面向抽象程式設計的技術基礎,實現了諸多的設計模式。 

不同點 

介面支援多繼承;抽象類不能實現多繼承。 
介面只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。 
介面是一組行為規範;抽象類是一個不完全的類,著重族的概念。 
介面可以用於支援回撥;抽象類不能實現回撥,因為繼承不支援。 
介面只包含方法、屬性、索引器、事件的簽名,但不能定義欄位和包含實現的方法;抽象類可以定義欄位、屬性、包含有實現的方法。  
介面可以作用於值型別和引用型別;抽象類只能作用於引用型別。例如,Struct就可以繼承介面,而不能繼承類。 

MSDN的建議是: 

如果預計要建立元件的多個版本,則建立抽象類。抽象類提供簡單易行的方法來控制組件版本。通過更新基類,所有繼承類都隨更改自動更新。另一方面,介面一旦建立就不能
更改。如果需要介面的新版本,必須建立一個全新的介面。 
如果建立的功能將在大範圍的全異物件間使用,則使用介面。抽象類應主要用於關係密切的物件,而介面最適合為不相關的類提供通用功能。 
如果要設計小而簡練的功能塊,則使用介面。如果要設計大的功能單元,則使用抽象類。 
如果要在元件的所有實現間提供通用的已實現功能,則使用抽象類。抽象類允許部分實現類,而介面不包含任何成員的實現。 
6. 結論 

介面和抽象類,是論壇上、課堂間討論最多的話題之一,之所以將這個老話題拿出來再議,是因為從我的體會來說,深刻的理解這兩個面向物件的基本內容,對於盤活面向物件
的抽象化程式設計思想至關重要。本文基本概況了介面和抽象類的概念、異同和使用規則,從學習的觀點來看,我認為這些總結已經足以表達其核心。但是,對於面向物件和軟體設
計的深入理解,還是建立在不斷實踐的基礎上,Scott說自己每天堅持一個小時用來寫Demo,那麼我們是不是更應該勤於鍵盤呢。對於介面和抽象類,請多用而知其然,多想而
知其奧吧。
什麼是抽象方法,什麼是虛方法
  如果一個基類方法要在派生類中被覆蓋,就必須把這個基類方法申明為virtual     
  抽象方法和虛擬方法的區別在於:
  虛擬方法有一個實現部分,併為派生類提供了覆蓋該方法的選項;相反,      
  抽象方法沒有提供實現部分,強制派生類覆蓋方法(否則派生類不能成為具體類)  
  

總結:

1. 如果一個類全部由抽象方法組成,那就是介面。即介面中的方法都是抽象方法。
2. 抽象類中的方法可以是抽象方法,也可以是非抽象方法(即普通方法)。
//在抽象類和介面中,抽象方法和介面方法都不能有方法體,需要依靠繼承基類的子類去實現
//抽象方法一定沒有方法體,而虛方法有方法體
//可以把抽象方法看作是沒有方法體的虛方法

1。在c語言中,函式是採用早期繫結的,即在程式執行之前,編譯器就要決定呼叫那個函式,這個過程叫做靜態聯編

2。動態聯編,這項功能在c++中預設是關閉的。開啟某個函式的晚期繫結的方式是在此函式的型別前加入virtual關鍵字,這種採用晚期繫結的函式就稱為虛擬函式。

 引自msdn:   
  若一個例項方法的宣告中含有   virtual   修飾符,則稱該方法為虛擬方法;一個虛擬方法的實現可以由派生類取代。取代所繼承的虛擬方法的實現的過程稱為重寫該方法;在一個虛擬方法呼叫中,該呼叫所涉及的那個例項的執行時型別確定了要被呼叫的究竟是該方法的哪一個實現。   
    
  虛擬函式的限制:   
    
  1.虛擬函式僅適用於有繼承關係的類物件,   所以只有類的成員函式才能說明為虛擬函式.     
  2.靜態成員函式不能是虛擬函式.     
  3.行內函數不能是虛擬函式.     
  4.建構函式不能是虛擬函式.     
  5.解構函式可以是虛擬函式.   
    
  介面可以有靜態成員、巢狀型別、抽象、虛擬成員、屬性和事件。實現介面的任何類都必須提供介面中所宣告的抽象成員的定義。介面可以要求任何實現類必須實現一個或多個其他介面。   
    
  對介面有以下限制:     
    
  介面可以用任何可訪問性來宣告,但介面成員必須全都具有公共可訪問性。     
  不能向成員或介面自身附加安全性許可權。     
  介面可以定義類建構函式,但不能定義例項建構函式。     
  每種語言都必須為需要成員的介面對映一個實現提供規則,因為不只一個介面可以用相同的簽名宣告成員,且這些成員可以有單獨的實現。   
    
  介面可以由類和結構來實現。為了指示類或結構實現了某介面,在該類或結構的基類列表中應該包含該介面的識別符號。如果一個類或結構實現某介面,則它還隱式實現該介面的所有基介面。即使在類或結構的基類列表中沒有顯式列出所有基介面,也是這樣。