在进行接口映射时,还要注意下面两点:
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。欲了解这方面的知识,请看下一节-接口转换。