| 關鍵字 | 語義 | 多態行為 | 基類要求 | 典型場景 |
|---|---|---|---|---|
override | 重寫虛方法/抽象方法 | ✅ 基類引用指向派生對象時調用派生實現 | 基類標註 virtual/abstract/override | 擴展/修改基類行為,保持契約 |
new | 隱藏基類同名成員 | ❌ 基類引用調用基類實現,派生引用調用派生實現 | 無要求,基類可無虛標記 | 被迫實現同名接口、避免命名衝突 |
public class Base {
public virtual void VirtualMethod() { Console.WriteLine("Base.Virtual"); }
public void NormalMethod() { Console.WriteLine("Base.Normal"); }
}
public class Derived : Base {
public override void VirtualMethod() { Console.WriteLine("Derived.Virtual"); } // 重寫
public new void NormalMethod() { Console.WriteLine("Derived.Normal"); } // 隱藏
}
// 測試
Base b = new Derived();
b.VirtualMethod(); // 輸出: Derived.Virtual (多態生效)
b.NormalMethod(); // 輸出: Base.Normal (靜態綁定)
Derived d = new Derived();
d.NormalMethod(); // 輸出: Derived.Normal (派生類型調用隱藏版)
new?IInterface.Method(),但基類已有同名非虛方法,無法 override,只能 new 隔離virtual,需在派生類提供新實現new 表達「這是新成員」override,設計基類時主動標記 virtual 開放擴展點new 時**必須**加上關鍵字,否則編譯器發出 CS0108 警告:「'Derived.Method()' 隱藏繼承成員,若有意請用 new」new,導致多態行為違反直覺,增加維護認知負擔sealed override,派生類不可再 override,只能 new 隔離「
override表達『我是同一契約的不同實現』,new表達『我只是碰巧同名,實則另一回事』。」