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

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

2013-11-13 12:20:02  來源: .NET編程 

  繼承接口實現

  接口具有不變性但這並不意味著接口不再發展類似於類的繼承性接口也可以繼承和發展

  注意接口繼承和類繼承不同首先類繼承不僅是說明繼承而且也是實現繼承而接口繼承只是說明繼承也就是說派生類可以繼承基類的方法實現而派生的接口只繼承了父接口的成員方法說明而沒有繼承父接口的實現其次C#中類繼承只允許單繼承但是接口繼承允許多繼承一個子接口可以有多個父接口

  接口可以從零或多個接口中繼承從多個接口中繼承時:後跟被繼承的接口名字多個接口名之間用分割被繼承的接口應該是可以訪問得到的比如從private 類型或internal 類型的接口中繼承就是不允許的接口不允許直接或間接地從自身繼承和類的繼承相似接口的繼承也形成接口之間的層次結構

  請看下面的例子

  using System ;
  interface IControl
  {
   void Paint( ) ;
  }
  interface ITextBox: IControl
  {
   void SetText(string text) ;
  }
  interface IListBox: IControl
  {
   void SetItems(string[] items) ;
  }
  interface IComboBox: ITextBox IListBox { }

  對一個接口的繼承也就繼承了接口的所有成員上面的例子中接口ITextBox和IListBox都從接口IControl中繼承也就繼承了接口IControl的Paint方法接口IComboBox從接口ITextBox和IListBox中繼承因此它應該繼承了接口ITextBox的SetText方法和IListBox的SetItems方法還有IControl的Paint方法

  一個類繼承了所有被它的基本類提供的接口實現程序

  不通過顯式的實現一個接口一個派生類不能用任何方法改變它從它的基本類繼承的接口映射例如在聲明中

  interface IControl
  {
   void Paint( );
  }
  class Control: IControl
  {
   public void Paint( ) {}
  }
  class TextBox: Control
  {
   new public void Paint( ) {}
  }

  TextBox 中的方法Paint 隱藏了Control中的方法Paint 但是沒有改變從ControlPaint 到IControlPaint 的映射而通過類實例和接口實例調用Paint將會有下面的影響

  Control c = new Control( ) ;
  TextBox t = new TextBox( ) ;
  IControl ic = c ;
  IControl it = t ;
  cPaint( ) ; // 影響ControlPaint( ) ;
  tPaint( ) ; // 影響TextBoxPaint( ) ;
  icPaint( ) ; // 影響ControlPaint( ) ;
  itPaint( ) ; // 影響ControlPaint( ) ;

  但是當一個接口方法被映射到一個類中的虛擬方法派生類就不可能覆蓋這個虛擬方法並且改變接口的實現函數例如把上面的聲明重新寫為

  interface IControl
  {
   void Paint( ) ;
  }
  class Control: IControl
  {
   public virtual void Paint( ) {}
  }
  class TextBox: Control
  {
   public override void Paint( ) {}
  }

  就會看到下面的結果

  Control c = new Control( ) ;
  TextBox t = new TextBox( ) ;
  IControl ic = c ;
  IControl it = t ;
  cPaint( ) ; // 影響ControlPaint( );
  tPaint( ) ; // 影響TextBoxPaint( );
  icPaint( ) ; // 影響ControlPaint( );
  itPaint( ) ; // 影響TextBoxPaint( );

  由於顯式接口成員實現程序不能被聲明為虛擬的就不可能覆蓋一個顯式接口成員實現程序一個顯式接口成員實現程序調用另外一個方法是有效的而另外的那個方法可以被聲明為虛擬的以便讓派生類可以覆蓋它例如:

  interface IControl
  {
   void Paint( ) ;
  }
  class Control: IControl
  {
   void IControlPaint( ) { PaintControl( ); }
   protected virtual void PaintControl( ) {}
  }
  class TextBox: Control
  {
   protected override void PaintControl( ) {}
  }

  這裡從Control 繼承的類可以通過覆蓋方法PaintControl 來對IControlPaint 的實現程序進行特殊化

  重新實現接口

  我們已經介紹過派生類可以對基類中已經定義的成員方法進行重載類似的概念引入到類對接口的實現中來叫做接口的重實現(reimplementation)繼承了接口實現的類可以對接口進行重實現這個接口要求是在類定義的基類列表中出現過的對接口的重實現也必須嚴格地遵守首次實現接口的規則派生的接口映射不會對為接口的重實現所建立的接口映射產生任何影響

  下面的代碼給出了接口重實現的例子

  interface IControl
  {
   void Paint( ) ;
   class Control: IControl
   void IControlPaint( ) {…}
   class MyControl: Control IControl
   public void Paint( ) {}
  }

  實際上就是Control把IControlPaint映射到了ControlIControlPaint上但這並不影響在MyControl中的重實現在MyControl中的重實現中IControlPaint被映射到MyControlPaint 之上

  在接口的重實現時繼承而來的公有成員定義和繼承而來的顯式接口成員的定義參與到接口映射的過程

  using System ;
  interface IMethods
  {
   void F( ) ;
   void G( ) ;
   void H( ) ;
   void I( ) ;
  }
  class Base: IMethods
  {
   void IMethodsF( ) { }
   void IMethodsG( ) { }
   public void H( ) { }
   public void I( ) { }
  }
  class Derived: Base IMethods
  {
   public void F( ) { }
   void IMethodsH( ) { }
  }

  這裡接口IMethods在Derived中的實現把接口方法映射到了DerivedFBaseIMethodsG DerivedIMethodsH 還有BaseI前面我們說過類在實現一個接口時同時隱式地實現了該接口的所有父接口同樣類在重實現一個接口時同時隱式地重實現了該接口的所有父接口

  using System ;
  interface IBase
  {
   void F( ) ;
  }
  interface IDerived: IBase
  {
   void G( ) ;
  }
  class C: IDerived
  {
   void IBaseF( )
   {
    //對F 進行實現的代碼…
   }
   void IDerivedG( )
   {
    //對G 進行實現的代碼…
   }
  }
  class D: C IDerived
  {
   public void F( )
   {
    //對F 進行實現的代碼…
   }
   public void G( )
   {
    //對G 進行實現的代碼…
   }
  }

  這裡對IDerived的重實現也同樣實現了對IBase的重實現把IBaseF 映射到了DF


From:http://tw.wingwit.com/Article/program/net/201311/15680.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.