接口

C#中,還有另外一種繼承方式,這種繼承方式被稱作接口繼承。接口以一種抽象的形式定義類型,作爲方法或者其他類型的集合,從而形成該類型的約定。接口和抽象類一樣,不能被直接實例化。與抽象類不同的是,接口並不提供任何的實現,接口中所有的方法與屬性都是抽象的

接口是一種約定,實現一個給定接口的任何對象都一定會提供對該接口中定義的成員的實現。接口僅定義了將被實現對象提供的成員,但接口的定義沒有給出關於成員的實現,只給出它們採用的參數和返回值類型,它們的實現完全由實現類承擔。接口的定義格式如下:

[attributes] [modifiers] interface identifier [:base-list] 
{
    interface-body
}
attributes  (可選):附加的定性信息

modifiers (可選):允許使用的修飾符有NEW和四個訪問修飾符,分別是new 、public 、protected、internal、private。在一個接口中同一修飾符不允許出現多次,new修飾符智能出現在嵌套接口中,表示覆蓋了集成而來的同名成員。public 、protected、internal、private修飾符定義了對接口的訪問權限,接口默認訪問級別是internal。

identifier:接口名稱。

base-list:接口名稱。

interface-body:對接口成員的定義。

接口內可以定義的接口成員包括:方法、屬性、索引器、事件。接口方法定義已命名的代碼塊;屬性定義可以用訪問器函數代碼驗證其有效性的變量;事件定義代碼中可能發生的動作,接口不能包含常量、字段、運算符、實例構造函數、析構構造函數活類型,也不能包含靜態成員。接口成員是自動public的,且不能包含任何訪問修飾符,類或結構實現接口時,該類或結構將爲該接口所有成員提供實現。

當類繼承接口時,成爲接口繼承或者是接口實現,他只能繼承成員的名稱和簽名。在實現繼承中,不支持多重繼承,但在接口繼承中可以繼承多個接口。還可以記性混合繼承,即可以只繼承一個基類、只繼承一個或者多個接口、同時繼承一個基類和一個或多個接口。其派生類都將繼承該接口的實現,

C#在及城管列表中使用位置表示法指定基類和接口。如果類同時繼承了一個基類和一個或多個接口,則基類總是放在第一的位置。

接口的成員及其全權名

接口的成員包括從基接口繼承的成員和由接口本身聲明的成員兩個部分,在一個接口中可以聲明零個或多個成員,這些接口成員必須是方法、屬性、事件或索引器。在聲明接口成員時,應遵循以下規則:
接口中的所有成員都隱式地具有public訪問屬性,在接口成員聲明中不能使用修飾符bastract、public、protected、internal、private、virtual、override或static,否則會發生編譯時錯誤。
一個接口方法的名稱必須與同一個接口中聲明的所有屬性和事件的名稱不同,該方法的簽名不能與在同一接口中聲明的其它所有方法的簽名相同,並且在同一接口中聲明的兩種方法的簽名不能只有ref和out不同。
接口成員不能包含代碼體。
屬性或事件的名稱必須與同一接口中聲明的所有其它成員的名稱不同。

接口成員的訪問及其二義性

對於接口成員的訪問是與類中的情況相同的,並遵循着這樣的規律:如果底層成員的命名與繼承而來的高層成員一致,那麼底層成員將隱藏同名的高層成員。但接口與類又有不同,接口允許多重繼承,在多重繼承中,如果兩個父類接口含有同名的成員,這時將產生二義性。這種二義性也是C#取消多重繼承的原因。在這種情況下,可以使用顯示強制轉換來解決這種二義性問題。

接口的實現

接口只有聲明部分,而沒有實現部分,接口的實現可分爲:隱式實現和顯示實現。當類或結構要實現的是單個接口時,這時可以使用隱式實現。隱式實現是指在繼承接口的類或結構中完成對接口聲明的實現,所實現的接口成員是屬於實現類的,可以直接通過類的對象訪問。如果類或者結構繼承了多個接口,那麼接口中相同名稱成員就要顯示實現。顯示實現是通過使用接口的完全限定名來實現接口成員的。顯示實現的成員是屬於接口的,可以看成寄託在類中的實現,訪問這些方法時要先把對象轉換成接口對象,然後通過接口對象調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章