程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則29:僅在對基類進行強制更新時才使用new修飾符(2)

Effective C#原則29:僅在對基類進行強制更新時才使用new修飾符(2)

編輯:關於C語言

你完成了你的 widget, 而且用戶可以使用它。然而你卻發現BaseWidget公司發布了一個新的版 本。而這正是你所渴望的,於是你立即購買並編譯你的MyWidget類。結果失敗了 ,因為BaseWidget的家伙們已經添加了他們自己的DoWidgetThings 方法:

public class BaseWidget
{
 public void DoWidgetThings()
 {
  // details elided.
 }
}

這是個難題,你的基類中隱藏了一個方法,而這又是在你的類的 名字空間中。有兩個方法解決這個問題,一個就是修改你的類中的方法名:

public class MyWidget : BaseWidget
{
 public void DoMyWidgetThings( )
 {
  // details elided.
 }
}

或者使用new修飾符:

public class MyWidget : BaseWidget
{
 public new void DoWidgetThings( )
 {
  // details elided.
 }
}

如 果你可以拿到所有使用MyWidget類的源代碼,那麼你應該選擇修改方法名,因為 這對於今後的運行會更簡單。然而,如果你已經向全世界的人發布了MyWidget類 ,這會迫使所有用戶來完成這個眾多的改變。這正是new修飾符容易解決的問題 ,你的用戶不用修改DoWidgetThings()方法而繼續使用它。沒有人會調用到 BaseWidget.DoWidgetThings()方法,因為(對於派生類而言)它們根本不存在。 在更新一個基類時,如果發現它與先前申明的成員發生了沖突,可以用new修飾 符來解決這個問題。

當然,在某些時候,你的用戶可能想調用基類的 Widget.DoWidgetThings()方法,這時你又回到了原來的問題上:兩個方法看上 去是一樣的,但其實是不同的。考慮到new修飾長期存在的歧意問題,有時候, 還是在短期上麻煩一下,修改方法名為上策。(譯注:長痛不如短痛。呵呵)

new修飾符必須小心謹慎的使用。如果它是有歧意的,你就在類上創建了 個模糊的方法。這只有在特殊情況下才使用,那就是升級基類時與你的類產生沖 突時。即使在這種情況下,也應該小心的使用它。最重要的是,其它任何時候都 不要用它。

返回教程目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved