前言
new 在重構這本書中寫道new就是壞代碼的味道,說明使用new的情況並不多。
在這裏我指的new 是方法修飾符,而不是指實例。
正文
看下new的作用:
new 修飾符可以重新定義從基類繼承下來的非虛成員。
也就是說你考慮的是是不是需要重新定義,如果不需要那麼就不應該使用new。
使用一個new 產生的一個問題:
MakeObject:
public class MakeObject: MyOtherClass
{
}
MyOtherClass:
public class MyOtherClass:MyClass
{
public new void MagicMethod()
{
Console.WriteLine(nameof(MyOtherClass));
}
}
MyClass:
public class MyClass
{
public void MagicMethod()
{
Console.WriteLine(nameof(MyClass));
}
}
那麼看一下:
static void Main(string[] args)
{
MakeObject make = new MakeObject();
MyClass c1=make as MyClass;
c1.MagicMethod();
MyOtherClass c2=make as MyOtherClass;
c2.MagicMethod();
Console.ReadKey();
}
運行結果爲:
MyClass
MyOtherClass
其實我們也能猜到結果就是這個,那麼有什麼問題呢?
我們使用同一個對象C上面調用同一個方法居然結果不一致,這取決於類型轉換爲MyClass 或者MyOtherClass 。
這樣一看好像沒什麼問題,但是卻不是。
因爲如果你想讓其子類重寫,你可以設置爲virtual,也就是虛方法。
這個new 其實就是讓我們來兼容一些東西的。
比如說MyClass 原本沒有MagicMethod 方法,但是後來加了這個MagicMethod 。
然後這時候myclass 的地方又非常多的地方使用,這時候就會報錯,當然現在會自動加上new了。
這只是給我們一個緩存區,最好的方式還是去修改子類的方法名,因爲最後可能我們還是要調用到MyClass 的MagicMethod 方法,這時候新的問題又產生了。