程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 再讀C# Programming Language之接口(interface)

再讀C# Programming Language之接口(interface)

編輯:.NET實例教程
接口的定義:

[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的接口。

接口不能直接或者間接的繼承自己。

在命名空間內的接口無法聲明為 privateprotected protected internal,只能是internalpublic,默認為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)方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved