前言
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 方法,这时候新的问题又产生了。