【转】基于C#的接口基础教程之五(2)

来源:互联网 发布:js json判断是否存在 编辑:程序博客网 时间:2024/04/29 05:46
2、继承接口实现
  
    接口具有不变性,但这并不意味着接口不再发展。类似于类的继承性,接口也可以继承和发展。
  
     注意:接口继承和类继承不同,首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。也就是说,派生类可以继承基类的方法实现,而 派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,其次,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 ,但是没有改变从Control.Paint 到IControl.Paint 的映射,而通过类实例和接口实例调用Paint将会有下面的影响
  
  Control c = new Control( ) ;
  TextBox t = new TextBox( ) ;
  IControl ic = c ;
  IControl it = t ;
  c.Paint( ) ; // 影响Control.Paint( ) ;
  t.Paint( ) ; // 影响TextBox.Paint( ) ;
  ic.Paint( ) ; // 影响Control.Paint( ) ;
  it.Paint( ) ; // 影响Control.Paint( ) ;
  
    但是,当一个接口方法被映射到一个类中的虚拟方法,派生类就不可能覆盖这个虚拟方法并且改变接口的实现函数。例如,把上面的声明重新写为
  
  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 ;
  c.Paint( ) ; // 影响Control.Paint( );
  t.Paint( ) ; // 影响TextBox.Paint( );
  ic.Paint( ) ; // 影响Control.Paint( );
  it.Paint( ) ; // 影响TextBox.Paint( );
  
    由于显式接口成员实现程序不能被声明为虚拟的,就不可能覆盖一个显式接口成员实现程序。一个显式接口成员实现程序调用另外一个方法是有效的,而另外的那个方法可以被声明为虚拟的以便让派生类可以覆盖它。例如:
  
  interface IControl {
   void Paint( ) ;
  }
  class Control: IControl {
   void IControl.Paint( ) { PaintControl( ); }
   protected virtual void PaintControl( ) {...}
  }
  class TextBox: Control {
   protected override void PaintControl( ) {...}
  }
  
    这里,从Control 继承的类可以通过覆盖方法PaintControl 来对IControl.Paint 的实现程序进行特殊化。 
原创粉丝点击