日常收集C#接口知识(知识全面)

2019-12-30 11:28:58王旭

  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( ) ;