new 修飾詞可在衍生類別中重新定義非虛擬繼承成員。但這會導致語意混淆:同一物件透過不同型別參考呼叫同名方法,卻執行不同程式碼。
public class MyClass { public void MagicMethod() { ... } }
public class MyOtherClass : MyClass { public new void MagicMethod() { ... } }
object c = new MyOtherClass();
((MyClass)c).MagicMethod(); // 呼叫 MyClass 版本(靜態繫結)
((MyOtherClass)c).MagicMethod(); // 呼叫 MyOtherClass 版本
這違反「同一物件同一行為」直覺,造成維護噩夢。
virtual。new 重新定義非虛擬成員。情境:你開發 MyWidget : BaseWidget,已發布廣泛使用。廠商更新 BaseWidget 新增 DoWidgetThings(),導致編譯衝突。
// 方案 1:改名(若掌握所有原始碼,長遠最佳)
public class MyWidget : BaseWidget { public void DoMyWidgetThings() { ... } }
// 方案 2:使用 new(已發布元件,無法要求用戶改碼)
public class MyWidget : BaseWidget { public new void DoWidgetThings() { ... } }
警示: 即使此情境,new 仍留下長期語意模糊。若用戶需呼叫基類版本,問題依存。短痛(改名)優於長痛(語意模糊)。
new 修飾詞極度謹慎使用,僅限「無法控制基類且基類更新導致衝突」的緊急情境。其他任何場合均應避免,改用虛擬函式機制或重新命名。