類別 A 實作介面 IC,衍生類別 B1 覆寫虛擬方法 M(),B2 同樣覆寫但額外宣告實作 IC。透過 List<IC> 呼叫 M() 時,B1 未正確多態(呼叫到 A 的實作)。
interface IC { void M(); }
class A : IC
{
void IC.M() { this.M(); } // 顯式實作,轉呼虛擬方法
public virtual void M() { Console.WriteLine("In class A"); }
}
class B1 : A
{
public override void M() { Console.WriteLine("In class B1"); }
}
class B2 : A, IC // IC 宣告可省略
{
public override void M() { Console.WriteLine("In class B2"); }
}
class Program
{
static void Main()
{
var list = new List<IC> { new A(), new B1(), new B2() };
foreach (IC c in list) c.M();
// 輸出:In class A / In class B1 / In class B2 ✓
var listA = new List<A> { new A(), new B1(), new B2() };
foreach (A a in listA) a.M(); // 同樣正確
}
}
private,僅能透過介面參考呼叫。this.M(),觸發虛擬方法分派,衍生類別的 override 即生效。B2 額外宣告 : IC 屬多餘,編譯器會忽略(基類已實作)。