基于C#的接口基础教程之五(3)

基于C#的接口基础教程之五(3)


Author: 黎宇/yesky  &;nbspFrom:Internet


                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 的实现程序进行特殊化。  (2005-5-20:02:29)
 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 警告:持续变种木马正在发起农历新年攻势!
 您可能对 [C#] 的这些文章也感兴趣:
论C#变得越来越臃肿是不可避免的
查询IP所在区段(C#)
在C#中利用SharpZipLib进行文件的压缩和解压缩
C# - Append a host header by code in IIS
在C#中调用Microsoft.VisualBasic命名空间下的类型验证函数
使用泛型实现单例提供者(原创翻译)
C#2 anonymous methods
Master Pages: Tips, Tricks, and Traps
Microsoft .NET 框架资源基础
基于.Net平台应用程序唯一运行实例实现
.net Framework 2.0 专门提供了配置文件的操作
正确实现 IDisposable