资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
全面剖析C#接口编程教程4之实现接口 (2)0-13 :09重新实现接口我们已经简介过,派生类可以对基类中已经定义的成员措施进行重载。类似的概念引入到类对接口的实现中来,叫做接口的重实现(rmpemenatn)。继承了接口实现的类可以对接口进行重实现。这个接口规定是在类定义的基类列表中浮现过的。对接口的重实现也必须严格地遵守初次实现接口的规则,派生的接口映射不会对为接口的重实现所建立的接口映射产生任何影响。下面的代码给出了接口重实现的例子:ntfc ontol void Pain();ss Control: IonrovoidCotol.Pai( ) lMyCotol:ntol, ICntrlpbic vidPit( )事实上就是:Cntrol把IContol.Pint映射到了ontrolControl.Pint上,但这并不影响在yCnro中的重实现。在MyCo中的重实现中,ICont.Pant被映射到MCnt.Pit之上。在接口的重实现时,继承而来的公有成员定义和继承而来的显式接口成员的定义参与到接口映射的过程。usn Syt;neface IMethos oid( ); vid () ;void H( ) ; void ( ) ;class ase: Meods oid MhodF( ) oidIMthds.G() publicvo H() pulicoid I() cass Drive: Bse, Meto publiiF() vo IMethd.( ) 这里,接口Ihds在Derive中的实现把接口措施映射到了er.,ae.Itods.,Deid.etodsH, 尚有Bae.I。前面我们说过,类在实现一种接口时,同步隐式地实现了该接口的所有父接口。同样,类在重实现一种接口时同步,隐式地重实现了该接口的所有父接口。sin yse ;interfeBas vod() ;itfac IDived: IBae voidG();classC: Ieived oidBa.F( ) 对F进行实现的代码 vodIer.() /对 进行实现的代码 cla :C, IDei blc vod F( ) /对F 进行实现的代码 ublioid G( ) /对 进行实现的代码 这里,对ivd的重实现也同样实现了对ase的重实现,把BeF映射到了D.F。映射接口类必须为在基类表中列出的所有接口的成员提供具体的实现。在类中定位接口成员的实现称之为接口映射(iface mappg )。映射,数学上表达一一相应的函数关系。接口映射的含义也是同样,接口通过类来实现,那么对于在接口中定义的每一种成员,都应当相应着类的一种成员来为它提供具体的实现。类的成员及其所映射的接口成员之间必须满足下列条件: 如果A和B都是成员措施,那么A和的名称、类型、形参表(涉及参数个数和每一种参数的类型)都应当是一致的。 如果A和B都是属性,那么和B的名称、类型应当一致,并且A和B的访问器也是类似的。但如果不是显式接口成员执行体,A容许增长自己的访问器。如果A和B都是时间那么和的名称、类型应当一致。 如果A和都是索引批示器,那么A和B的类型、形参表(涉及参数个数和每一种参数的类型)应当一致。并且和的访问器也是类似的。但如果A不是显式接口成员执行体,容许增长自己的访问器。那么,对于一种接口成员,如何拟定由哪一种类的成员来实现呢?即一种接口成员映射的是哪一种类的成员?在这里,我们论述一下接口映射的过程。假设类实现了一种接口IInerfc,Membr是接口Inerface中的一种成员,在定位由谁来实现接口成员emer,即Mmbr的映射过程是这样的:1、如果中存在着一种显式接口成员执行体,该执行体与接口Intere 及其成员Mber相相应,则由它来实现Memer 成员。2、如果条件()不满足,且C中存在着一种非静态的公有成员,该成员与接口成员Memer相相应,则由它来实现Memb成员。、如果上述条件仍不满足,则在类定义的基类列表中寻找一种C的基类D,用来替代C。、反复环节 ,遍历C的所有直接基类和非直接基类,直到找到一种满足条件的类的成员。5、如果仍然没有找到,则报告错误。下面是一种调用基类措施来实现接口成员的例子。类s2 实现了接口nterace1,类Clss2的基类Class 的成员也参与了接口的映射,也就是说类Clss2 在对接口Inerfc1进行实现时,使用了类Clas1提供的成员措施F来实现接口Ierface1的成员措施F:interfacItace1 vd F( ) ;ca lss1 pubic vid F() pbc vo G()lassClss2: ass, nrface1 new li voi G( ) 注意:接口的成员涉及它自己定义的成员,并且涉及该接口所有父接口定义的成员。在接口映射时,不仅要对接口定义体中显式定义的所有成员进行映射,并且要对隐式地从父接口那里继承来的所有接口成员进行映射。在进行接口映射时,还要注意下面两点: 在决定由类中的哪个成员来实现接口成员时,类中显式阐明的接口成员比其他成员优先实现。 使用Private、protte和staic修饰符的成员不能参与实现接口映射。例如:interce ICloneable objt ln( ) ;cla C: IConeabe ojct ICloeaeone( ) pblicbeloe( )例子中成员Ilonble.lone称为接口ICloneabl的成员lo的实现者,由于它是显式阐明的接口成员,比其他成员有着更高的优先权。如果一种类实现了两个或两个以上名字、类型和参数类型都相似的接口,那么类中的一种成员就也许实现所有这些接口成员:nerface Intrl voiPnt() ;nefcForm od ant( );caPae:ontrl,IFr blicvid ain() 这里,接口IConr和IForm的措施Paint都映射到了类a中的aint措施。固然也可以分别用显式的接口成员分别实现这两个措施:interfaceICnl voidPai();itrfacIorm voi Pan( ) ;clasage:Contrl, Form puliid ControlPint( ) /具体的接口实现代码 plcidFrmain( ) /具体的接口实现代码 上面的两种写法都是对的的。但是如果接口成员在继承中覆盖了父接口的成员,那么对该接口成员的实现就也许必须映射到显式接口成员执行体。看下面的例子:iterfce Iae i P et;itrfae Dived:ase new int ( ) ;接口Ierived从接口Bse中继承,这时接口IDerivd的成员措施覆盖了父接口的成员措施。由于这时存在着同名的两个接口成员,那么对这两个接口成员的实现如果不采用显式接口成员执行体,编译器将无法辨别接口映射。因此,如果某个类要实现接口eived,在类中必须至少定义一种显式接口成员执行体。采用下面这些写法都是合理的:/一:对两个接口成员都采用显式接口成员执行体来实现lass C:Ierive nt se. get /具体的接口实现代码in IrivdP( )/具体的接口实现代码 二:对Ibae的接口成员采用显式接口成员执行体来实现lssC: IDerved itIae.Pget/具体的接口实现代码pu int P( )/具体的接口实现代码 三:对Died 的接口成员采用显式接口成员执行体来实现clasC: Deriedpubc int get/具体的接口实现代码in Derved.()/具体的接口实现代码另一种状况是,如果一种类实现了多种接口,这些接口又拥有同一种父接口,这个父接口只容许被实现一次。usg System ;nteface IControl vdn( ); intrfac Text:Iontol vid tt(strin t); interce ILtBox: IControl voi ettes(i iems); lssComboBox: nrl,ITeBox, ILstBo void ICotrl.aint( ) id ITextBox.tTex(strin tex) o IitBx.Setes(strn items) 上面的例子中,类CbBo实现了三个接口:rl,Teox和ILsBo。如果觉得CooBox不仅实现了ICoro接口,并且在实现Iexox和ILsBox的同步,又分别实现了它们的父接口ICotol。事实上,对接口TextBo 和ILitBox 的实现,分享了对接口Conto
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号