c# 優化代碼的一些規則——什麼情況下應該使用new[七]

前言

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 方法,這時候新的問題又產生了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章