在进行接口映射时,还要注意下面两点:
1、在决定由类中的哪个成员来实现接口成员时,类中显式说明的接口成员比其它成员优先实现。
2、使用Private、protected和static修饰符的成员不能参与实现接口映射。例如:
例子中成员ICloneable.Clone 称为接口ICloneable 的成员Clone 的实现者,因为它是显式说明的接口成员,比其它成员有着更高的优先权。
如果一个类实现了两个或两个以上名字、类型和参数类型都相同的接口,那么类中的一个成员就可能实现所有这些接口成员:
这里,接口IControl和IForm的方法Paint都映射到了类Page中的Paint方法。当然也可以分别用显式的接口成员分别实现这两个方法:
上面的两种写法都是正确的。但是如果接口成员在继承中覆盖了父接口的成员,那么对该接口成员的实现就可能必须映射到显式接口成员执行体。看下面的例子:
接口IDerived从接口IBase中继承,这时接口IDerived 的成员方法覆盖了父接口的成员方法。因为这时存在着同名的两个接口成员,那么对这两个接口成员的实现如果不采用显式接口成员执行体,编译器将无法分辨接口映射。所以,如果某个类要实现接口IDerived,在类中必须至少定义一个显式接口成员执行体。采用下面这些写法都是合理的:
另一种情况是,如果一个类实现了多个接口,这些接口又拥有同一个父接口,这个父接口只允许被实现一次。
上面的例子中,类ComboBox实现了三个接口:IControl,ITextBox和IListBox。如果认为ComboBox不仅实现了IControl接口,而且在实现ITextBox和IListBox的同时,又分别实现了它们的父接口IControl。实际上,对接口ITextBox 和IListBox 的实现,分享了对接口IControl 的实现。
我们对C#的接口有了较全面的认识,基本掌握了怎样应用C#的接口编程,但事实上,C#的不仅仅应用于.NET平台,它同样支持以前的COM,可以实现COM类到.NET类的转换,如C#调用API。欲了解这方面的知识,请看下一节-接口转换。
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。欲了解这方面的知识,请看下一节-接口转换。