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

C#虛函數解析機制實戰演示(二):多層繼承下override/new/sealed組合行為驗證

     編輯:關於C語言

四層繼承類定義


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()CDFoo1C定義new Foo1 → 鏈中斷 → 執行C.Foo1C.Foo1()
aD.Foo2()CDFoo2A.Foo2(非虛) → B.new virtual Foo2(新鏈頭) → D.override sealed Foo2(鏈尾) → 執行D.Foo2D.Foo2()
aC.Foo1()ACFoo1A.virtual Foo1 → B.override Foo1(鏈延續) → C.new Foo1(鏈中斷) → 執行B.Foo1(鏈最後虛方法)B.Foo1()
aC.Foo2()ACFoo2A.Foo2(非虛) → 靜態綁定 → 執行A.Foo2A.Foo2()

核心規則驗證

  • new切斷繼承鏈,建立新鏈頭。
  • override延續鏈,且隱式virtual。
  • sealed延續鏈並封閉(不可再override)。
  • 非虛方法(無virtual/override/new)靜態綁定,無繼承鏈。
  • 引用類型決定靜態綁定起點,對象類型決定動態分發終點。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved