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

.NET 虛函數機制深度解析:virtual、override、new、sealed 與介面實現的完整圖譜

     編輯:關於.NET

基礎虛函數調用

class CA { public virtual void Foo() { Console.WriteLine("CA.Foo"); } }
class CB : CA { public override void Foo() { Console.WriteLine("CB.Foo"); } }

class Test {
    public static void InvokeFoo(CA ca) { ca.Foo(); }
    public static void Main() { InvokeFoo(new CB()); } // 輸出: CB.Foo
}

關鍵字:virtual(啟用運行時綁定)、override(覆寫基類實現)

四種組合實驗結果

基類 virtual子類 override輸出說明
是是CB.Foo正常多態
是否CA.Foo運行時綁定,但子類未覆寫
否是編譯錯誤非虛方法不可 override
否否CA.Foo編譯時靜態綁定

override vs new:方法隱藏與覆寫的本質區別

class CA { public virtual void Foo() { Console.WriteLine("CA.Foo"); } }
class CB : CA { public override void Foo() { Console.WriteLine("CB.Foo"); } }
class CC : CA { public new void Foo() { Console.WriteLine("CC.Foo"); } } // 隱藏

class Test {
    public static void Main() {
        Console.WriteLine(typeof(CB).GetMethods().Length); // 5 (含 1 個 Foo)
        Console.WriteLine(typeof(CC).GetMethods().Length); // 6 (含 2 個 Foo)
    }
}
  • override:替換基類虛方法槽位,方法數不增加
  • new:隱藏基類方法,新增獨立方法槽位(IL 級別為 virtual final)
  • 無修飾符默認 new(編譯器警告)

介面方法隱式虛函數

interface IA { void Foo(); }
class CA : IA { 
    public void Foo() { Console.WriteLine("CA.Foo"); } // 隱式 virtual final
}
  • 介面方法天然為虛函數,不可顯式加 virtual
  • 實現類方法預設為 sealed (final),子類無法再 override
  • 需在實現類顯式加 virtual 才允許子類覆寫

複雜繼承鏈實驗

interface IA { void Foo(); }
class CA : IA { public virtual void Foo() { Console.WriteLine("CA.Foo"); } }
class CB : CA, IA { public void Foo() { Console.WriteLine("CB.Foo"); } } // 無 override、無 virtual

class Test {
    public static void InvokeFoo(CA ca) { ca.Foo(); }
    public static void Main() {
        InvokeFoo(new CA()); // 輸出?
        InvokeFoo(new CB()); // 輸出?
    }
}

思考:CB.Foo 會被調用嗎?為什麼?(答案:CB.Foo 隱藏 CA.Foo,但 CA.Foo 仍為虛方法,CB 未 override,故調用 CA.Foo)

IL 視角:virtual、final、newslot

  • virtual:方法槽位可被覆寫
  • final:封鎖覆寫(C# sealed)
  • newslot:強制分配新虛方法槽位(C# new 隱藏)

總結

.NET 虛函數機制核心在於虛方法表槽位管理。virtual 開啟槽位,override 替換槽位內容,new 分配新槽位,sealed 封鎖槽位。介面實現預設 virtual final,需顯式 virtual 開放覆寫。理解 IL 層面機制,能精準控制多態行為,避免隱藏導致的難診斷 Bug。

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