大多數語言難以達成二進位相容,C# 透過明確語法要求開發者表達意圖,從根本上解決版本衝突。
// Author A
namespace A {
public class Base { } // v1
}
// Author B
namespace B {
class Derived : A.Base {
public virtual void F() { Console.WriteLine("Derived.F"); }
}
}
// Author A
namespace A {
public class Base { // v2
public virtual void F() { Console.WriteLine("Base.F"); }
}
}
Derived.F 在編譯時 Base 尚無 F,故非覆寫。Base 時,Derived.F 是否應視為覆寫?C# 預設不視為覆寫,保護既有行為。override 關鍵字;若無意,保持原狀或加上 new 明確隱藏。| 關鍵字 | 語意 | 版本升級行為 |
|---|---|---|
| (無標記) | 新方法,非覆寫 | 基底新增同名虛擬方法時,不發生覆寫,發出警告 CS0114 |
new | 明確隱藏基底成員 | 消除警告,語意清晰 |
override | 明確覆寫基底虛擬方法 | 基底必須有對應 virtual,否則編譯錯誤 |