实现接口3

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 jfbao 的 blog

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

本文关键:实现接口3
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top