什麼是抽象類?編程
抽象類是特殊的類,只是不能被實例化;除此之外,具備類的其餘特性;重要的是抽象類能夠包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類能夠派生自一個抽象類,能夠覆蓋基類的抽象方法也能夠不覆蓋,若是不覆蓋,則其派生類必須覆蓋它們。抽象類不能被密封。若是派生類沒有實現全部的抽象方法,則該派生類也必須聲明爲抽象類。設計模式
什麼是接口?函數
接口是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數和返回值。接口方法不能包含任何實現,CLR容許接口能夠包含事件、屬性、索引器、靜態方法、靜態字段、靜態構造函數以及常數。spa
例子:飛機會飛,鳥會飛,他們都繼承了同一個接口「飛」;可是F22屬於飛機抽象類,鴿子屬於鳥抽象類。設計
相同點: (1)都不能被直接實例化,均可以經過繼承實現其抽象方法。繼承
(2)都是面向抽象編程的技術基礎,實現了諸多的設計模式。索引
不一樣點:(1) 接口支持多繼承;抽象類不能實現多繼承。 接口只能定義抽象規則;接口
(2)抽象類既能夠定義規則,還可能提供已實現的成員。 接口是一組行爲規範;事件
(3)抽象類是一個不徹底的類,着重族的概念。 接口能夠用於支持回調;class
(4)抽象類不能實現回調,由於繼承不支持。 接口只包含方法、屬性、索引器、事件的簽名,
但 不能定義字段和包含實現的方法;
(5)抽象類能夠定義字段、屬性、包含有實現的方法。 接口能夠做用於值類型和引用類型;
(6)抽象類只能做用於引用類型。例如,Struct就能夠繼承接口,而不能繼承類。
(7)抽象類有構造方法,接口卻沒有構造方法。
接口的應用場合:
抽象類的應用場合:
一句話,在既須要統一的接口,又須要實例變量或缺省的方法的狀況下,就可使用它。最多見的有: