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

C# virtual、override 與多態核心機制

     編輯:關於C語言

方法分類速覽

核心規則:互斥性

一個方法只能使用上述修飾符中的一個。例如 static virtual、virtual abstract 皆為編譯錯誤。

virtual + override 實現多態


public class Test
{
    public virtual void Hello()
    {
        Console.WriteLine("Hello from Test");
    }
}

public class TestMe : Test
{
    public override void Hello()
    {
        Console.WriteLine("Hello from TestMe !!!");
    }
}

// 使用
Test t = new TestMe();
t.Hello(); // 輸出:Hello from TestMe !!!

為什麼需要 virtual?

  • 默認情況下,派生類同名方法會隱藏基類方法(編譯期綁定),而非重寫。
  • virtual 告訴編譯器:「這個方法的調用地址在運行時根據實例類型決定」。
  • override 明確表示「我提供這個虛擬方法的新實現」。

方法聲明完整語法


[可見性] [修飾符] 返回類型 方法名(參數列表) { 方法體 }
// 例:
public static void Test(int a) { Console.WriteLine(a); }

常見陷阱

  1. 忘記 virtual:派生類用 new 隱藏而非多態,基類引用調用仍執行基類方法。
  2. 密封類/方法:sealed class 不可繼承;sealed override 終止虛擬鏈。
  3. 構造函數調用虛擬方法:基類構造函數中調用虛擬方法時,派生類覆寫版本會執行,但派生類字段尚未初始化,極易出錯。

進階:基類調用


public override void Hello()
{
    base.Hello(); // 顯式調用基類實現
    Console.WriteLine("Additional logic");
}

總結

  • static:類級,編譯期綁定,無多態。
  • virtual/override:實例級,運行期分發,多態核心。
  • abstract:強制派生類實現,隱含 virtual。
  • sealed:切斷繼承/重寫鏈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
修飾符綁定時機所屬可繼承/重寫
static編譯期類不可重寫(可隱藏)
virtual運行期實例可 override
abstract運行期實例必須 override
sealed運行期實例禁止繼承/重寫