在 C# 物件導向設計中,abstract(抽象)、virtual(虛擬)與 override(覆寫)是實現多型與擴充性的核心關鍵字。本文將系統整理三者的語法規則、行為差異與最佳實務,並搭配程式碼範例說明。
sealed 修飾詞(否則無法被繼承)。virtual,但不可明確加上 virtual 或 static。public abstract void MyMethod();override 方法提供。抽象屬性行為類同抽象方法,不可用於靜態屬性,衍生類別以 override 實作。
override 覆寫實作。static、abstract、override 共用。虛擬屬性語法與抽象屬性相似,衍生類別同樣以 override 覆寫。
public 必須維持 public)。new、static、virtual、abstract。new 修飾詞用於刻意隱藏基類同名成員,非多型行為。若衍生類別宣告同名成員未加 new,編譯器會發出警告;加上 new 可消除警告並明確表達隱藏意圖。隱藏成員仍存在於基類實例中,透過基類參考呼叫時仍會執行基類版本。
using System;
namespace VirtualMethod {
class BaseClass {
public void RealMethod() {
Console.WriteLine("BaseClass RealMethod");
}
public virtual void VirtualMethod() {
Console.WriteLine("BaseClass VirtualMethod");
}
}
class Derived : BaseClass {
// 隱藏基類 RealMethod
new public void RealMethod() {
Console.WriteLine("Derived RealMethod");
}
// 覆寫虛擬方法
public override void VirtualMethod() {
Console.WriteLine("Derived VirtualMethod");
}
}
class Tester {
static void Main() {
BaseClass b = new BaseClass();
Derived d = new Derived();
b.RealMethod(); // BaseClass RealMethod
d.RealMethod(); // Derived RealMethod
b.VirtualMethod(); // BaseClass VirtualMethod
d.VirtualMethod(); // Derived VirtualMethod
Console.WriteLine();
// 多型行為:基類參考指向衍生實例
b = d;
b.RealMethod(); // BaseClass RealMethod (隱藏,非多型)
b.VirtualMethod(); // Derived VirtualMethod (多型生效)
}
}
}
| 關鍵字 | 用途 | 多型支援 | 基類成員要求 |
|---|---|---|---|
| abstract | 強制衍生類別實作,無預設實作 | 是 | 僅限抽象類別 |
| virtual | 提供預設實作,允許選擇性覆寫 | 是 | 一般類別即可 |
| override | 覆寫虛擬/抽象/覆寫成員 | 是 | 基類成員需為 virtual/abstract/override |
| new | 隱藏基類同名成員 | 否 | 無限制 |
virtual,保留預設行為;若基類不應被實例化且無預設邏輯,改用 abstract。override,避免意外隱藏導致多型失效。new,並加上註解說明原因。