大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > C#接口知识大全收藏

C#接口知识大全收藏(7)

关键词:接口收藏知识大全  阅读(3619) 赞(20)

[摘要]接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。


 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 的实现程序进行特殊化。



相关评论