類繼承基類提供的所有接口實現。不顯式重實現則無法改變繼承的映射。範例:
interface IControl { void Paint(); }
class Control : IControl { public void Paint() { ... } }
class TextBox : Control { new public void Paint() { ... } }
TextBox.Paint 隱藏 Control.Paint,但不改變 Control.Paint → IControl.Paint 映射。調用結果:
Control c = new Control(); TextBox t = new TextBox();
IControl ic = c; IControl it = t;
c.Paint(); // Control.Paint
t.Paint(); // TextBox.Paint
ic.Paint(); // Control.Paint
it.Paint(); // Control.Paint (非虛方法,接口調用仍走基類)
若接口方法映射到虛方法,派生類重寫虛方法可改變實現:
class Control : IControl { public virtual void Paint() { ... } }
class TextBox : Control { public override void Paint() { ... } }
此時 it.Paint() 調用 TextBox.Paint。
顯式接口成員不可聲明 virtual,無法直接重寫。最佳實踐:顯式實現調用另一 protected virtual 方法,派生類重寫該方法:
class Control : IControl {
void IControl.Paint() { PaintControl(); }
protected virtual void PaintControl() { ... }
}
class TextBox : Control {
protected override void PaintControl() { ... }
}