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

深入解析 C# 虛擬方法解析機制:從繼承鏈到動態分派

     編輯:關於C#

C# 的虛擬方法機制是物件導向多型的核心。本文從方法繼承鏈的建立、關鍵字語意、到執行時期的動態分派流程,系統性剖析其運作原理,並透過實戰範例驗證推論。

核心關鍵字與繼承鏈規則

方法宣告時可使用四個關鍵字控制繼承行為:

  • virtual:允許子類別同名方法建立繼承鏈
  • override:與父類別同名方法建立繼承鏈,隱含 virtual
  • new:切斷與父類別同名方法的繼承鏈
  • sealed:配合 override 使用,密封繼承鏈,禁止進一步覆寫

若無關鍵字,預設具有 new 行為(隱藏父類別同名方法),編譯器會發出警告建議明確指定。

方法繼承鏈構建邏輯

從基類別到衍生類別,依序檢查各類別對方法的定義:

  1. 未使用 override 或 sealed 的定義成為繼承鏈起點
  2. 使用 virtual 的定義會被附加到鏈中
  3. 遇到 new 即終止鏈(該方法不加入);遇到 sealed 加入後終止鏈

執行時期動態分派

當透過基類別參考呼叫衍生類別實例的方法時:

  • 非虛擬方法:直接呼叫參考型別定義的版本
  • 虛擬方法:沿著繼承鏈向下尋找,執行鏈底端(最衍生)的實作

實戰驗證:四層繼承體系

public class A {
    public virtual void Foo1() { Console.WriteLine("A.Foo1()"); }
    public void Foo2() { Console.WriteLine("A.Foo2()"); }
}
public class B : A {
    public override void Foo1() { Console.WriteLine("B.Foo1()"); }
    public new virtual void Foo2() { Console.WriteLine("B.Foo2()"); }
}
public class C : B {
    public new void Foo1() { Console.WriteLine("C.Foo1()"); }
}
public class D : C {
    public override sealed void Foo2() { Console.WriteLine("D.Foo2()"); }
}

測試碼與輸出:

C aD = new D(); A aC = new C();
aD.Foo1(); // C.Foo1() - 參考型別 C,Foo1 在 C 以 new 斷鏈
aD.Foo2(); // D.Foo2() - 參考型別 C,Foo2 鏈為 B→D,底端為 D
aC.Foo1(); // B.Foo1() - 參考型別 A,Foo1 鏈為 A→B,底端為 B
aC.Foo2(); // A.Foo2() - 參考型別 A,Foo2 非虛擬,直接呼叫 A 版本

方法繼承鏈圖解

進階應用:this、base 與委派

  • this:依當前型別解析,遵循相同虛擬分派規則
  • base:直接呼叫基類別實作,不經虛擬分派
  • 委派:封裝方法指標時仍遵循虛擬解析規則

善用 Visual Studio「重構→重命名」功能可直觀觀察繼承鏈中斷點,輔助理解與除錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved