四層繼承類定義
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()"); // 斷開A.Foo2鏈
}
public class C : B
{
public new void Foo1() => Console.WriteLine("C.Foo1()"); // 斷開B.Foo1鏈
}
public class D : C
{
public override sealed void Foo2() => Console.WriteLine("D.Foo2()"); // 封閉Foo2鏈
}
調用代碼與輸出結果
C aD = new D();
A aC = new C();
aD.Foo1(); // C.Foo1() was invoked.
aD.Foo2(); // D.Foo2() was invoked.
aC.Foo1(); // B.Foo1() was invoked.
aC.Foo2(); // A.Foo2() was invoked.
詳細解析
| 調用站點 | 靜態類型 | 動態類型 | 方法 | 解析路徑 | 結果 |
| aD.Foo1() | C | D | Foo1 | C定義new Foo1 → 鏈中斷 → 執行C.Foo1 | C.Foo1() |
| aD.Foo2() | C | D | Foo2 | A.Foo2(非虛) → B.new virtual Foo2(新鏈頭) → D.override sealed Foo2(鏈尾) → 執行D.Foo2 | D.Foo2() |
| aC.Foo1() | A | C | Foo1 | A.virtual Foo1 → B.override Foo1(鏈延續) → C.new Foo1(鏈中斷) → 執行B.Foo1(鏈最後虛方法) | B.Foo1() |
| aC.Foo2() | A | C | Foo2 | A.Foo2(非虛) → 靜態綁定 → 執行A.Foo2 | A.Foo2() |
核心規則驗證
new切斷繼承鏈,建立新鏈頭。
override延續鏈,且隱式virtual。
sealed延續鏈並封閉(不可再override)。
- 非虛方法(無
virtual/override/new)靜態綁定,無繼承鏈。
- 引用類型決定靜態綁定起點,對象類型決定動態分發終點。