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