1. 程式人生 > >第6篇 接口

第6篇 接口

技術 多個 之間 語言 java語言 解耦 但是 method ()

接口是C#的一種引用數據類型。接口像是一個抽象類,可以定義方法成員,屬性,索引器和事件等,但是接口不提供對成員的實現,繼承接口的類必須提供接口成員的實現。

類用於描述的是事物的共性基本功能,接口用於定義的都是事物的額外功能。

接口的好處

規範性:定義接口像是在定義一種規範,當一個項目龐大復雜的時候,用接口去定義業務規範,這些接口可以用來告訴開發人員需要實現哪些具體的業務功能,並且連命名也被定義好了(可以防止開發人員任意取名)。

多繼承多繼承的好處是可以讓子類具備更多的功能,但是多繼承的弊端是調用的不確定性。當A類和B類都有相同的Method()方法時候,C類如果同時繼承A類和B類,此時C類的實例化對象在調用Method()方法時就會調用不確定。所以C#不直接支持多繼承,而是通過接口來解決問題,將多繼承轉換成了多實現。

解耦和擴展:接口不需要管每個功能的具體實現,實現由派生類去做。面向接口的編程將接口與實現分離,實現了接口的類便具備了接口定義的功能,提高了軟件的擴展性。

多態性:多態是指父類的引用類型變量指向了子類的對象或者是接口類型的引用類型變量指向了接口實現類的對象。實現面向接口編程下的多態:接口 變量 = new 接口實現類的對象。

接口的定義與實現

聲明接口使用interface關鍵字,接口成員可以是屬性,方法,索引器和事件,不能包含字段和構造函數等。所有的接口都隱式地具有public訪問修飾符。

C#中實現接口與繼承基類的形式一樣,直接在實現類後面跟上冒號和接口即可(java語言則是用implements

關鍵字)。

接口的特點

  1. 接口不可以實例化,接口是用來被實現的。
  2. 需要覆蓋了接口中所有的成員的子類,才可以實例化。
  3. 一個類繼承另一個類同時,還可以實現多個接口。

關於接口的繼承與實現的關系

類與類之間是繼承關系,只能單繼承;類與接口之間是實現關系,而且可以多實現;接口與接口之間是繼承關系,而且接口之間是多繼承。

因此我們講C#不直接支持多繼承,但並不是講C#沒有多繼承,因為接口就是可以多繼承。

接口的問題。

當我們某個實現類只需要接口中的部分功能,但是為了實例化,必須要全部覆蓋,這使得代碼的復用性很差,怎麽辦?

為了方便創建接口的子類對象,可以用一個類先把接口中的所有方法都實現(空實現),該類創建對象沒有意義,並且它必須要被繼承,因為接口需方法要實現,所以將該類抽象。這就是傳說中的沒有抽象方法的抽象類。如此以來,可以用子類去繼承抽象類,在覆蓋掉自己需要實現的方法即可。

技術分享圖片

抽象類與接口的區別

  1. C#支持單繼承,不直接支持多繼承。它們的派生類只能繼承一個抽象類,但是可以實現多個接口。即單繼承,多實現。
  2. 抽象類中可以包含字段,構造函數,析構函數,靜態成員或者常量等,但是接口中不可以。
  3. 抽象類中可以定義非抽象成員的實現,但是接口中不能定義任何實現。
  4. 抽象類中的成員可以私有的(只要是不抽象的),受保護的,內部的或者受保護的內部成員,但是接口中的成員必須是公共的。

備註:關於多態的內容請看“第7篇 多態”

第6篇 接口