[Attributes] [new | public | protected | internal | private] interface IReader [ : interface-base]
{
interface-method-declaration
interface-property-declaration
interface-event-declaration
interface-indexer-declaration
}
new修飾符只被允許在類(Class)的內部的接口使用,它表示這個接口成員隱藏了一個繼承來的同名的成員函數。
一個接口可以繼承自0到多個接口,這些接口被稱作這個接口的顯示基接口(explicit base interface)。
一個高開放度的接口不能繼承一個比其開放程度低的接口,如一個被描述為public的接口不能繼承一個被描述為internal的接口。
接口不能直接或者間接的繼承自己。
在命名空間內的接口無法聲明為 private、protected 或 protected internal,只能是internal或public,默認為internal
接口的繼承是完全的傳遞閉包,即,接口繼承所有基接口(base interface)的成員
接口的成員只能是方法,屬性,事件,索引器,不能包含常數,字段,操作符,實例構造函數,析構函數,類型和任何靜態成員。
接口的成員隱式聲明為public,成員中包含任何修飾符都會產生編譯錯誤。
在一個接口的聲明中,不能有相同簽名的方法,屬性,事件,索引器。而可以與繼承的接口中的成員有相同的簽名,這不會引起錯誤,但是為產生一個警告,為了消除這個警告,可以顯示的在重名的成員前加new關鍵字,來顯示的隱藏基接口(base interface)中的成員。如果在沒有重名的成員前加new關鍵字,也會出現警告。
接口成員的聲明方式:
[Attributes] [new] return-type identifIEr ([formal-parameter-list]) ;
接口屬性聲明如下:
interface-property-declaration:
[attributes] [new] type identifIEr { interface-Accessors }
interface-Accessors:
[attributes] get ;
[attributes] set ;
[attributes] get ; [attributes] set ;
[attributes] set ; [attributes] get ;
接口事件聲明如下:
[attributes] [new] event type identifIEr ;
接口索引器聲明如下:
[attributes] [new] type this [ formal-parameter-list ] { interface-Accessors }
接口成員的訪問:
在單繼承中,接口的使用和類(Class)一樣,但是接口可以多繼承,所以在接口多繼承使用時,會出現繼承自兩個無關的接口,他們中有相同名字的成員,這時要顯示的轉換成相應的接口來調用,否則出現編譯時錯誤。顯示的轉換不會產生運行時的代價。如果出現了new關鍵字隱藏基接口(base interface)中的成員,那麼遵循以下規則:
如果一個成員從任意一條路徑被隱藏,那麼他在所有的路徑都被隱藏,除非強制轉換接口調用。
接口可以通過全限定名(fully qualifIEd name)來使用。全限定名的使用方法為“接口名.成員名”,其中接口名必須是聲明該成員的接口名,不能是派生的接口名。如果有命名空間,則再加上命名空間,如System.ICloneable.Clone
接口可以被類(Class)和結構(Struct)實現,實現接口的類(Class)和結構(Struct)隱式實現該接口所有的基接口(base interface)。類(Class)和結構(Struct)可以聲明顯示接口成員實現(explicit interface member implementations)。即,在類(Class)和結構(Struct)中實現的接口方法前,明確的帶有接口的名稱。以下把顯示接口成員實現簡寫為EIMI。
全限定名的成員只能通過接口實例來訪問。在顯示實現接口成員時,任何訪問修飾符都不允許的,以下修飾符也是不允許的:abstract, override,virtual,static
EIMI不能通過類(Class)和結構(Struct)的實例訪問,它只能通過接口的實例訪問。當類(Class)和結構(Struct)實現的接口不關心類(Class)和結構(Struct)如何被使用時,這個特點很有用。
EIMI可以使相同簽名的接口成員不會混淆。如果不使用EIMI,類(Class)和結構(Struct)不允許實現相同簽名和返回值的接口成員。
正確使用EIMI的方法是,類(Class)和結構(Struct)必須在基類(base class) 列表聲明接口並在實現時以全限定名實現接口成員,並做到完全匹配接口成員的聲明。
接口映射:
類(Class)和結構(Struct)必須實現列在基類(base class)列表上的所有接口成員。定位在類(Class)和結構(Struct)中實現的接口成員的過程叫做接口映射。
EIMI有更高的優先級做接口映射。
如果類(Class)和接口(Struct)實現了的接口中存在被隱藏的成員,那麼這些成員必須通過EIMI來實現。
如果一個類(Class)實現了多個接口中有相同的基接口(base interface),那麼只能有一個基接口(base interface)的成員實現。
基類的成員參與接口映射。
接口的繼承:
接口的實現是可以繼承的。
沒有顯示的重新實現接口,派生類不論如何也不可能改變接口的映射關系。
但是當接口被映射到一個類(Class)的虛方法(virtual method)時,派生類就可以重寫虛方法來改變接口的實現映射。但是EIMI不能被聲明為虛方法,所以不能重寫EIMI。但是一個有效的方式是使用EIMI來調用其他方法。
接口的重實現:
一個繼承了接口實現的類(Class),可以通過包含接口在基類(base class)列表上來重新實現該接口。
抽象類和接口:
抽象類(Abstract Class) 和 一般的類(Class) 一樣,要實現列在基類(Base Class) 列表的所有接口的所有成員,但是,抽象類(Abstract Class) 可以映射這些成員到抽象(abstract)方法上。顯示接口成員實現不能是抽象的,但是可以調用抽象類(Abstract Class)中的抽象(abstract)方法。