熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

基於C#的接口基礎教程之七

2022-06-13   來源: .NET編程 

  映射接口

  類必須為在基類表中列出的所有接口的成員提供具體的實現在類中定位接口成員的實現稱之為接口映射(interface mapping )

  映射數學上表示一一對應的函數關系接口映射的含義也是一樣接口通過類來實現那麼對於在接口中定義的每一個成員都應該對應著類的一個成員來為它提供具體的實現

  類的成員及其所映射的接口成員之間必須滿足下列條件

  如果A和B都是成員方法那麼A和B的名稱類型形參表(包括參數個數和每一個參數的類型)都應該是一致的

  如果A和B都是屬性那麼A和B的名稱類型應當一致而且A和B的訪問器也是類似的但如果A不是顯式接口成員執行體A允許增加自己的訪問器

  如果A和B都是時間那麼A和B的名稱類型應當一致

  如果A和B都是索引指示器那麼A和B的類型形參表(包括參數個數和每一個參數的類型)應當一致而且A和B的訪問器也是類似的但如果A不是顯式接口成員執行體A允許增加自己的訪問器

  那麼對於一個接口成員怎樣確定由哪一個類的成員來實現呢?即一個接口成員映射的是哪一個類的成員?在這裡我們敘述一下接口映射的過程假設類C實現了一個接口IInterfaceMember是接口IInterface中的一個成員在定位由誰來實現接口成員Member即Member的映射過程是這樣的

  如果C中存在著一個顯式接口成員執行體該執行體與接口IInterface 及其成員Member相對應則由它來實現Member 成員

  如果條件()不滿足且C中存在著一個非靜態的公有成員該成員與接口成員Member相對應則由它來實現Member 成員

  如果上述條件仍不滿足則在類C定義的基類列表中尋找一個C 的基類D用D來代替C

  重復步驟 遍歷C的所有直接基類和非直接基類直到找到一個滿足條件的類的成員

  如果仍然沒有找到則報告錯誤

  下面是一個調用基類方法來實現接口成員的例子類Class 實現了接口Interface類Class 的基類Class 的成員也參與了接口的映射也就是說類Class 在對接口Interface進行實現時使用了類Class提供的成員方法F來實現接口Interface的成員方法F

  interface Interface
  {
   void F( ) ;
  }
  class Class
  {
   public void F( ) { }
   public void G( ) { }
  }
  class Class: Class Interface
  {
   new public void G( ) {}
  }

  注意接口的成員包括它自己定義的成員而且包括該接口所有父接口定義的成員在接口映射時不僅要對接口定義體中顯式定義的所有成員進行映射而且要對隱式地從父接口那裡繼承來的所有接口成員進行映射

  在進行接口映射時還要注意下面兩點

  在決定由類中的哪個成員來實現接口成員時類中顯式說明的接口成員比其它成員優先實現

  使用Privateprotected和static修飾符的成員不能參與實現接口映射例如

  interface ICloneable
  {
   object Clone( ) ;
  }
  class C: ICloneable
  {
   object ICloneableClone( ) {…}
   public object Clone( ) {…}
  }

  例子中成員ICloneableClone 稱為接口ICloneable 的成員Clone 的實現者因為它是顯式說明的接口成員比其它成員有著更高的優先權

  如果一個類實現了兩個或兩個以上名字類型和參數類型都相同的接口那麼類中的一個成員就可能實現所有這些接口成員

  interface IControl
  {
   void Paint( ) ;
  }
  interface IForm
  {
   void Paint( ) ;
  }
  class Page: IControl IForm
  {
   public void Paint( ) {…}
  }

  這裡接口IControl和IForm的方法Paint都映射到了類Page中的Paint方法當然也可以分別用顯式的接口成員分別實現這兩個方法

  interface IControl
  {
   void Paint( ) ;
  }
  interface IForm
  {
   void Paint( ) ;
  }
  class Page: IControl IForm
  {
   public void IControlPaint( )
   {
    //具體的接口實現代碼
   }
   public void IFormPaint( )
   {
    //具體的接口實現代碼
   }
  }

  上面的兩種寫法都是正確的但是如果接口成員在繼承中覆蓋了父接口的成員那麼對該接口成員的實現就可能必須映射到顯式接口成員執行體看下面的例子

  interface IBase
  {
   int P { get; }
  }
  interface IDerived: IBase
  {
   new int P( ) ;
  }

  接口IDerived從接口IBase中繼承這時接口IDerived 的成員方法覆蓋了父接口的成員方法因為這時存在著同名的兩個接口成員那麼對這兩個接口成員的實現如果不采用顯式接口成員執行體編譯器將無法分辨接口映射所以如果某個類要實現接口IDerived在類中必須至少定義一個顯式接口成員執行體采用下面這些寫法都是合理的

  //一對兩個接口成員都采用顯式接口成員執行體來實現
  lass C: IDerived
  {
   int IBaseP
   get
   { //具體的接口實現代碼 }
   int IDerivedP( )
   {//具體的接口實現代碼 }
  }  
  //二對Ibase 的接口成員采用顯式接口成員執行體來實現
  class C: IDerived
  {
   int IBaseP
   get {//具體的接口實現代碼}
   public int P( ){//具體的接口實現代碼 }
  }
  //三對IDerived 的接口成員采用顯式接口成員執行體來實現
  class C: IDerived
  {
   public int P
   get {//具體的接口實現代碼}
   int IDerivedP( ){//具體的接口實現代碼}
  }

  另一種情況是如果一個類實現了多個接口這些接口又擁有同一個父接口這個父接口只允許被實現一次

  using System ;
  interface IControl
  {
   void Paint( ) ;
   interface ITextBox: IControl
   {
    void SetText(string text) ;
   }
   interface IListBox: IControl
   {
    void SetItems(string[] items) ;
   }
   class ComboBox: IControl ITextBox IListBox
   {
    void IControlPaint( ) {…}
    void ITextBoxSetText(string text) {…}
    void IListBoxSetItems(string[] items) {…}
   }
  }

  上面的例子中類ComboBox實現了三個接口IControlITextBox和IListBox如果認為ComboBox不僅實現了IControl接口而且在實現ITextBox和IListBox的同時又分別實現了它們的父接口IControl實際上對接口ITextBox 和IListBox 的實現分享了對接口IControl 的實現

  我們對C#的接口有了較全面的認識基本掌握了怎樣應用C#的接口編程但事實上C#的不僅僅應用於NET平台它同樣支持以前的COM可以實現COM類到NET類的轉換如C#調用API欲了解這方面的知識請看下一節接口轉換


From:http://tw.wingwit.com/Article/program/net/201311/15762.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.