全面剖析C#接口编程教程4——之实现接口-(2)

上传人:m**** 文档编号:398565555 上传时间:2023-09-10 格式:DOC 页数:6 大小:32.50KB
返回 下载 相关 举报
全面剖析C#接口编程教程4——之实现接口-(2)_第1页
第1页 / 共6页
全面剖析C#接口编程教程4——之实现接口-(2)_第2页
第2页 / 共6页
全面剖析C#接口编程教程4——之实现接口-(2)_第3页
第3页 / 共6页
全面剖析C#接口编程教程4——之实现接口-(2)_第4页
第4页 / 共6页
全面剖析C#接口编程教程4——之实现接口-(2)_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《全面剖析C#接口编程教程4——之实现接口-(2)》由会员分享,可在线阅读,更多相关《全面剖析C#接口编程教程4——之实现接口-(2)(6页珍藏版)》请在金锄头文库上搜索。

1、全面剖析C#接口编程教程4之实现接口 (2)-04-13 15:09重新实现接口我们已经简介过,派生类可以对基类中已经定义的成员措施进行重载。类似的概念引入到类对接口的实现中来,叫做接口的重实现(re-implementation)。继承了接口实现的类可以对接口进行重实现。这个接口规定是在类定义的基类列表中浮现过的。对接口的重实现也必须严格地遵守初次实现接口的规则,派生的接口映射不会对为接口的重实现所建立的接口映射产生任何影响。下面的代码给出了接口重实现的例子:interface IControl void Paint( ) ;class Control: IControlvoid ICont

2、rol.Paint( ) class MyControl: Control, IControlpublic void Paint( ) 事实上就是:Control把IControl.Paint映射到了Control.IControl.Paint上,但这并不影响在MyControl中的重实现。在MyControl中的重实现中,IControl.Paint被映射到MyControl.Paint 之上。在接口的重实现时,继承而来的公有成员定义和继承而来的显式接口成员的定义参与到接口映射的过程。using System ;interface IMethods void F( ) ; void G( )

3、 ; void H( ) ; void I( ) ;class Base: IMethods void IMethods.F( ) void IMethods.G( ) public void H( ) public void I( ) class Derived: Base, IMethods public void F( ) void IMethods.H( ) 这里,接口IMethods在Derived中的实现把接口措施映射到了Derived.F,Base.IMethods.G, Derived.IMethods.H, 尚有Base.I。前面我们说过,类在实现一种接口时,同步隐式地实现了

4、该接口的所有父接口。同样,类在重实现一种接口时同步,隐式地重实现了该接口的所有父接口。using System ;interface IBase void F( ) ;interface IDerived: IBase void G( ) ;class C: IDerived void IBase.F( ) /对F 进行实现的代码 void IDerived.G( ) /对G 进行实现的代码 class D: C, IDerived public void F( ) /对F 进行实现的代码 public void G( ) /对G 进行实现的代码 这里,对IDerived的重实现也同样实现了对

5、IBase的重实现,把IBase.F 映射到了D.F。映射接口类必须为在基类表中列出的所有接口的成员提供具体的实现。在类中定位接口成员的实现称之为接口映射(interface mapping )。映射,数学上表达一一相应的函数关系。接口映射的含义也是同样,接口通过类来实现,那么对于在接口中定义的每一种成员,都应当相应着类的一种成员来为它提供具体的实现。类的成员及其所映射的接口成员之间必须满足下列条件: 如果A和B都是成员措施,那么A和B的名称、类型、形参表(涉及参数个数和每一种参数的类型)都应当是一致的。 如果A和B都是属性,那么A和B的名称、类型应当一致,并且A和B的访问器也是类似的。但如果

6、A不是显式接口成员执行体,A容许增长自己的访问器。 如果A和B都是时间那么A和B的名称、类型应当一致。 如果A和B都是索引批示器,那么A和B的类型、形参表(涉及参数个数和每一种参数的类型)应当一致。并且A和B的访问器也是类似的。但如果A不是显式接口成员执行体,A容许增长自己的访问器。那么,对于一种接口成员,如何拟定由哪一种类的成员来实现呢?即一种接口成员映射的是哪一种类的成员?在这里,我们论述一下接口映射的过程。假设类C实现了一种接口IInterface,Member是接口IInterface中的一种成员,在定位由谁来实现接口成员Member,即Member的映射过程是这样的:1、如果C中存在

7、着一种显式接口成员执行体,该执行体与接口IInterface 及其成员Member相相应,则由它来实现Member 成员。2、如果条件(1)不满足,且C中存在着一种非静态的公有成员,该成员与接口成员Member相相应,则由它来实现Member 成员。3、如果上述条件仍不满足,则在类C定义的基类列表中寻找一种C 的基类D,用D来替代C。4、反复环节1-3 ,遍历C的所有直接基类和非直接基类,直到找到一种满足条件的类的成员。5、如果仍然没有找到,则报告错误。下面是一种调用基类措施来实现接口成员的例子。类Class2 实现了接口Interface1,类Class2 的基类Class1 的成员也参与了

8、接口的映射,也就是说类Class2 在对接口Interface1进行实现时,使用了类Class1提供的成员措施F来实现接口Interface1的成员措施F:interface Interface1 void F( ) ;class Class1 public void F( ) public void G( ) class Class2: Class1, Interface1 new public void G( ) 注意:接口的成员涉及它自己定义的成员,并且涉及该接口所有父接口定义的成员。在接口映射时,不仅要对接口定义体中显式定义的所有成员进行映射,并且要对隐式地从父接口那里继承来的所有接口

9、成员进行映射。在进行接口映射时,还要注意下面两点: 在决定由类中的哪个成员来实现接口成员时,类中显式阐明的接口成员比其他成员优先实现。 使用Private、protected和static修饰符的成员不能参与实现接口映射。例如:interface ICloneable object Clone( ) ;class C: ICloneable object ICloneable.Clone( ) public object Clone( ) 例子中成员ICloneable.Clone称为接口ICloneable的成员Clone的实现者,由于它是显式阐明的接口成员,比其他成员有着更高的优先权。如果

10、一种类实现了两个或两个以上名字、类型和参数类型都相似的接口,那么类中的一种成员就也许实现所有这些接口成员: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(

11、 ) ;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的成员措施覆盖了父接口的成员措施。

12、由于这时存在着同名的两个接口成员,那么对这两个接口成员的实现如果不采用显式接口成员执行体,编译器将无法辨别接口映射。因此,如果某个类要实现接口IDerived,在类中必须至少定义一种显式接口成员执行体。采用下面这些写法都是合理的:/一:对两个接口成员都采用显式接口成员执行体来实现lass C: IDerived int IBase.P get /具体的接口实现代码 int IDerived.P( )/具体的接口实现代码 /二:对Ibase 的接口成员采用显式接口成员执行体来实现class C: IDerived int IBase.Pget /具体的接口实现代码public int P( )/

13、具体的接口实现代码 /三:对IDerived 的接口成员采用显式接口成员执行体来实现class C: IDerivedpublic int Pget /具体的接口实现代码int IDerived.P( )/具体的接口实现代码另一种状况是,如果一种类实现了多种接口,这些接口又拥有同一种父接口,这个父接口只容许被实现一次。using System ;interface IControl void Paint( ) ; interface ITextBox: IControl void SetText(string text) ; interface IListBox: IControl void

14、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 的实现,分享了对接口IContro

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 习题/试题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号