实现接口3

王朝c#·作者佚名  2006-12-17
宽屏版  字体: |||超大  

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- 王朝网络 版权所有