override 修飾詞規則
- 只能覆寫
virtual、abstract 或 override 成員。
- 不可覆寫
non-virtual 或 static 方法。
- 覆寫成員與被覆寫成員必須擁有相同簽名、存取層級。
- 不可使用
new、static、virtual、abstract 修飾 override 方法。
程式碼範例:虛擬方法 vs 一般方法
class Base
{
public void RealMethod() => Console.WriteLine("Base.RealMethod");
public virtual void VirtualMethod() => Console.WriteLine("Base.VirtualMethod");
}
class Derived : Base
{
// 隱藏一般方法 (非多型)
new public void RealMethod() => Console.WriteLine("Derived.RealMethod (new)");
// 覆寫虛擬方法 (多型)
public override void VirtualMethod() => Console.WriteLine("Derived.VirtualMethod (override)");
}
class Test
{
static void Main()
{
Base b = new Base();
Derived d = new Derived();
b.RealMethod(); // Base.RealMethod
d.RealMethod(); // Derived.RealMethod (new)
b.VirtualMethod(); // Base.VirtualMethod
d.VirtualMethod(); // Derived.VirtualMethod (override)
Console.WriteLine();
// 多型行為展示
b = d;
b.RealMethod(); // Base.RealMethod (靜態繫結,隱藏不生效)
b.VirtualMethod(); // Derived.VirtualMethod (動態繫結,override 生效)
}
}
執行結果解析
Base.RealMethod
Derived.RealMethod (new)
Base.VirtualMethod
Derived.VirtualMethod (override)
Base.RealMethod ← 隱藏成員不具多型
Derived.VirtualMethod ← 覆寫成員具多型
核心觀念
new (隱藏):**編譯期靜態繫結**,參考型別決定呼叫哪個版本。
override (覆寫):**執行期動態繫結**,實際物件型別決定呼叫哪個版本。
- 設計時:預期衍生類需多型擴充 →
virtual + override;單純取代實作無多型需求 → new。