介面是C#的一種引用數據類型。介面像是一個抽象類,可以定義方法成員,屬性,索引器和事件等,但是介面不提供對成員的實現,繼承介面的類必須提供介面成員的實現。 類用於描述的是事物的共性基本功能,介面用於定義的都是事物的額外功能。 一 介面的好處 規範性:定義介面像是在定義一種規範,當一個項目龐大複雜的時 ...
介面是C#的一種引用數據類型。介面像是一個抽象類,可以定義方法成員,屬性,索引器和事件等,但是介面不提供對成員的實現,繼承介面的類必須提供介面成員的實現。
類用於描述的是事物的共性基本功能,介面用於定義的都是事物的額外功能。
一 介面的好處
規範性:定義介面像是在定義一種規範,當一個項目龐大複雜的時候,用介面去定義業務規範,這些介面可以用來告訴開發人員需要實現哪些具體的業務功能,並且連命名也被定義好了(可以防止開發人員任意取名)。
多繼承:多繼承的好處是可以讓子類具備更多的功能,但是多繼承的弊端是調用的不確定性。當A類和B類都有相同的Method()方法時候,C類如果同時繼承A類和B類,此時C類的實例化對象在調用Method()方法時就會調用不確定。所以C#不直接支持多繼承,而是通過介面來解決問題,將多繼承轉換成了多實現。
解耦和擴展:介面不需要管每個功能的具體實現,實現由派生類去做。面向介面的編程將介面與實現分離,實現了介面的類便具備了介面定義的功能,提高了軟體的擴展性。
多態性:多態是指父類的引用類型變數指向了子類的對象或者是介面類型的引用類型變數指向了介面實現類的對象。實現面向介面編程下的多態:介面 變數 = new 介面實現類的對象。
二 介面的定義與實現
聲明介面使用interface關鍵字,介面成員可以是屬性,方法,索引器和事件,不能包含欄位和構造函數等。所有的介面都隱式地具有public訪問修飾符。
C#中實現介面與繼承基類的形式一樣,直接在實現類後面跟上冒號和介面即可(java語言則是用implements關鍵字)。
三 介面的特點
- 介面不可以實例化,介面是用來被實現的。
- 需要覆蓋了介面中所有的成員的子類,才可以實例化。
- 一個類繼承另一個類同時,還可以實現多個介面。
四 關於介面的繼承與實現的關係
類與類之間是繼承關係,只能單繼承;類與介面之間是實現關係,而且可以多實現;介面與介面之間是繼承關係,而且介面之間是多繼承。
因此我們講C#不直接支持多繼承,但並不是講C#沒有多繼承,因為介面就是可以多繼承。
五 介面的問題。
當我們某個實現類只需要介面中的部分功能,但是為了實例化,必須要全部覆蓋,這使得代碼的復用性很差,怎麼辦?
為了方便創建介面的子類對象,可以用一個類先把介面中的所有方法都實現(空實現),該類創建對象沒有意義,並且它必須要被繼承,因為介面需方法要實現,所以將該類抽象。這就是傳說中的沒有抽象方法的抽象類。如此以來,可以用子類去繼承抽象類,在覆蓋掉自己需要實現的方法即可。
六 抽象類與介面的區別
- C#支持單繼承,不直接支持多繼承。它們的派生類只能繼承一個抽象類,但是可以實現多個介面。即單繼承,多實現。
- 抽象類中可以包含欄位,構造函數,析構函數,靜態成員或者常量等,但是介面中不可以。
- 抽象類中可以定義非抽象成員的實現,但是介面中不能定義任何實現。
- 抽象類中的成員可以私有的(只要是不抽象的),受保護的,內部的或者受保護的內部成員,但是介面中的成員必須是公共的。
備註:關於多態的內容請看“第7篇 多態”