| 修飾符 | 綁定時機 | 所屬 | 可繼承/重寫 |
| static | 編譯期 | 類 | 不可重寫(可隱藏) |
| virtual | 運行期 | 實例 | 可 override |
| abstract | 運行期 | 實例 | 必須 override |
| sealed | 運行期 | 實例 | 禁止繼承/重寫 |
核心規則:互斥性
一個方法只能使用上述修飾符中的一個。例如 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); }
常見陷阱
- 忘記 virtual:派生類用
new 隱藏而非多態,基類引用調用仍執行基類方法。
- 密封類/方法:
sealed class 不可繼承;sealed override 終止虛擬鏈。
- 構造函數調用虛擬方法:基類構造函數中調用虛擬方法時,派生類覆寫版本會執行,但派生類字段尚未初始化,極易出錯。
進階:基類調用
public override void Hello()
{
base.Hello(); // 顯式調用基類實現
Console.WriteLine("Additional logic");
}
總結
static:類級,編譯期綁定,無多態。
virtual/override:實例級,運行期分發,多態核心。
abstract:強制派生類實現,隱含 virtual。
sealed:切斷繼承/重寫鏈。
- 上一篇文章: C# 實現類 QQ 屏幕截圖(一):整體架構與截屏核心
- 下一篇文章: C# 數字金額轉中文大寫(二):輔助轉換函數
Copyright ©
程式碼之家 All Rights Reserved