首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

基類與介面混合繼承的宣告問題(四):修正非預期多態行為

     編輯:關於C語言

問題情境

類別 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 屬多餘,編譯器會忽略(基類已實作)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved