你完成 MyWidget,使用者可用。但 BaseWidget 公司發布新版本,添加了他們自己的 DoWidgetThings 方法:
public class BaseWidget { public void DoWidgetThings() { /* details */ } }
難題:基類中隱藏一個方法,且在你類別名稱空間中。兩種解決:修改你類別方法名:
public class MyWidget : BaseWidget { public void DoMyWidgetThings() { /* details */ } }
或用 new 修飾符:
public class MyWidget : BaseWidget { public new void DoWidgetThings() { /* details */ } }
若能拿到所有使用 MyWidget 原始碼,應選擇修改方法名,對未來執行更簡單。但若已向全世界發布 MyWidget,會迫使所有使用者完成眾多改變。這正是 new 修飾符容易解決的問題:使用者無需修改 DoWidgetThings() 繼續使用。沒人會調用 BaseWidget.DoWidgetThings(),因對衍生類別而言它們根本不存在。更新基類時發現與先前宣告成員衝突,可用 new 修飾符解決。
某些時候使用者想調用基類 Widget.DoWidgetThings(),又回到原問題:兩方法看起來一樣但實際不同。考慮 new 修飾符長期存在的歧義問題,有時短期麻煩一下,修改方法名為上策。(譯註:長痛不如短痛。呵呵)
new 修飾符必須小心謹慎使用。若有歧義,你在類別上建立模糊方法。只有特殊情況下才用:升級基類時與你類別產生衝突。即使這種情況也應小心使用。最重要的是,其他任何時候都不用它。