实现接口6

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

本文简介:选择自 jfbao 的 blog

在进行接口映射时,还要注意下面两点:

  1、在决定由类中的哪个成员来实现接口成员时,类中显式说明的接口成员比其它成员优先实现。

  2、使用private、protected和static修饰符的成员不能参与实现接口映射。例如:

interface icloneable {
 object clone( ) ;
}
class c: icloneable {
 object icloneable.clone( ) {…}
 public object clone( ) {…}
}

  例子中成员icloneable.clone 称为接口icloneable 的成员clone 的实现者,因为它是显式说明的接口成员,比其它成员有着更高的优先权。

  如果一个类实现了两个或两个以上名字、类型和参数类型都相同的接口,那么类中的一个成员就可能实现所有这些接口成员:

interface icontrol {
 void paint( ) ;
}
interface iform {
 void paint( ) ;
}
class page: icontrol, iform {
 public void paint( ) {…}
}

  这里,接口icontrol和iform的方法paint都映射到了类page中的paint方法。当然也可以分别用显式的接口成员分别实现这两个方法:

interface icontrol {
 void paint( ) ;
}
interface iform {
 void paint( ) ;
}
class page: icontrol, iform {
 public void icontrol.paint( ) {
 //具体的接口实现代码
}
public void iform.paint( ) {
 //具体的接口实现代码
}
}

  上面的两种写法都是正确的。但是如果接口成员在继承中覆盖了父接口的成员,那么对该接口成员的实现就可能必须映射到显式接口成员执行体。看下面的例子:

interface ibase {
 int p { get; }
}
interface iderived: ibase {
 new int p( ) ;
}

  接口iderived从接口ibase中继承,这时接口iderived 的成员方法覆盖了父接口的成员方法。因为这时存在着同名的两个接口成员,那么对这两个接口成员的实现如果不采用显式接口成员执行体,编译器将无法分辨接口映射。所以,如果某个类要实现接口iderived,在类中必须至少定义一个显式接口成员执行体。采用下面这些写法都是合理的:

//一:对两个接口成员都采用显式接口成员执行体来实现
lass c: iderived {
 int ibase.p
 get
 { //具体的接口实现代码 }
  int iderived.p( ){
  //具体的接口实现代码 }
 }
//二:对ibase 的接口成员采用显式接口成员执行体来实现
class c: iderived {
 int ibase.p
 get {//具体的接口实现代码}
  public int p( ){
  //具体的接口实现代码 }
 }
//三:对iderived 的接口成员采用显式接口成员执行体来实现
class c: iderived{
 public int p
 get {//具体的接口实现代码}
 int iderived.p( ){
 //具体的接口实现代码}
}

  另一种情况是,如果一个类实现了多个接口,这些接口又拥有同一个父接口,这个父接口只允许被实现一次。

using system ;
interface icontrol {
 void paint( ) ;
 interface itextbox: icontrol {
 void settext(string text) ;
}
interface ilistbox: icontrol {
 void setitems(string[] items) ;
}
class combobox: icontrol, itextbox, ilistbox {
 void icontrol.paint( ) {…}
 void itextbox.settext(string text) {…}
 void ilistbox.setitems(string[] items) {…}
}

  上面的例子中,类combobox实现了三个接口:icontrol,itextbox和ilistbox。如果认为combobox不仅实现了icontrol接口,而且在实现itextbox和ilistbox的同时,又分别实现了它们的父接口icontrol。实际上,对接口itextbox 和ilistbox 的实现,分享了对接口icontrol 的实现。

  我们对c#的接口有了较全面的认识,基本掌握了怎样应用c#的接口编程,但事实上,c#的不仅仅应用于.net平台,它同样支持以前的com,可以实现com类到.net类的转换,如c#调用api。欲了解这方面的知识,请看下一节-接口转换。

本文关键:实现接口6
 

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

go top