15.4.5 接口的重實現
我們已經介紹過,派生類可以對基類中已經定義的成員方法進行重載。類似的概念引入到類對接口的實現中來,叫做接口的重實現(re-implementation)。
繼承了接口實現的類可以對接口進行重實現。這個接口要求是在類聲明的基類列表中出現過的。對接口的重實現也必須嚴格地遵守首次實現接口的規則,派生的接口映射不會對為接口的重實現所建立的接口映射產生任何影響。下面的代碼給出了接口重實現的例子:
interface IControl { void paint(); } class Control:IControl { void IControl.Paint(){...} } class MyControl:Control,IControl { public void Paint(){} }
實際上就是:Control把IControl.Paint映射到了Control.IControl.Paint上,但這並不影響在MyControl中的重實現。在MyControl中的重實現中,IControl.Paint被映射到MyControl.Paint之上。
在接口的重實現時,繼承而來的公有成員聲明和繼承而來的顯式接口成員的聲明參與到接口映射的過程。
using System; interface IMethods { void F(); void G(); 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 IMthods.H(){} }
這裡,接口IMethods在Derived中的實現把接口方法映射到了Derived.F,Base.IMethods.G,Derived.IMethods.H,還有Base.I.
前面我們說過,類在實現一個接口時,同時隱式地實現了該接口的所有父接口。同樣,類在重實現一個接口時,同時隱式地重實現了該接口的所有父接口。
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的重實現也同樣實現了對IBase的重實現,把IBase.F映射到了D.F。