有時候我們需要表達一種抽象的東西,它是一些東西的概括,但我們又不能真正的看到它成爲一個實體在我們眼前出現,爲此面向對象的編程語言便有了抽象類的概念。C#作爲一個面向對象的語言,必然也會引入抽象類這一概念。接口和抽象類使您可以創建組件交互的定義。通過接口,可以指定組件必須實現的方法,但不實際指定如何實現方法。抽象類使您可以創建行爲的定義,同時提供用於繼承類的一些公共實現。對於在組件中實現多態行爲,接口和抽象類都是很有用的工具。
一個抽象類必須爲類的基本類列表中列出的接口的所有成員提供實現程序。但是,一個抽象類被允許把接口方法映射到抽象方法中。例如:
interface IMethods { void F(); void G(); } abstract class C: IMethods { public abstract void F(); public abstract void G(); } |
這裏, IMethods 的實現函數把F和G映射到抽象方法中,它們必須在從C派生的非抽象類中被覆蓋。
注意顯式接口成員實現函數不能是抽象的,但是顯式接口成員實現函數當然可以調用抽象方法。例如:
interface IMethods { void F(); void G(); } abstract class C: IMethods { void IMethods.F() { FF(); } void IMethods.G() { GG(); } protected abstract void FF(); protected abstract void GG(); } |
這裏,從C派生的非抽象類要覆蓋FF 和 GG, 因此提供了IMethods的實際實現程序。
組件化程序設計方法繼承並發展了面向對象的程序設計方法。它把對象技術應用於系統設計,對面向對象的程序設計的實現過程作了進一步的抽象。我們可以把組件化程序設計方法用作構造系統的體系結構層次的方法,並且可以使用面向對象的方法很方便地實現組件。
接口是組件之間的協議,描述了組件對外提供的服務。從技術上講接口是一組包含了函數型方法的數據結構。通過這組數據結構,客戶代碼可以調用組件對象的功能。接口可以從父接口中繼承。接口的繼承首先是說明性繼承,不是實現性繼承,它的實現需要通過類或結構來實現;其次接口繼承可以是多繼承。
接口包含的成員有方法、屬性、索引指示器和事件。由於接口允許多繼承,在可能發生二義性的地方可以採用全權名來避免。
可以用類來實現接口。在類中定位接口成員的實現稱之爲接口映射。類必須爲接口的所有成員提供具體的實現,包括接口中顯式定義的成員,以及接口從父接口中繼承而來的成員。同樣,在對接口的實現過程中可以採用顯式接口成員執行體來避免產生二義性。
派生類可以對基類已經實現的接口進行重實現。
抽象類也可以實現接口,但接口成員必須映射到抽象類的抽象成員。抽象類的派生類如果是非抽象類,則必須通過方法重載來實現接口成員。