我读过关于new
关键词在方法签名中并看到了下面的例子this https://stackoverflow.com/questions/1014295/c-sharp-new-keyword-in-method-signature发帖了,但还是不明白为什么要写new
关键词在方法签名中。如果我们省略它,它仍然会做同样的事情。它将编译。会有警告,但它会编译。
所以,写new
在方法签名中只是为了可读性?
public class A
{
public virtual void One() { /* ... */ }
public void Two() { /* ... */ }
}
public class B : A
{
public override void One() { /* ... */ }
public new void Two() { /* ... */ }
}
B b = new B();
A a = b as A;
a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B
这个问题隐含着:为什么不new
隐藏基类成员时需要关键字吗?原因是脆弱的基类问题。假设你有一个图书馆:
public class Base
{
public void M() { }
}
并且您已经在自己的代码库中派生了一个类:
public class Derived : Base
{
public void N() { }
}
现在,库作者发布了新版本,添加了另一种方法Base
:
public class Base
{
public void M() { }
public void N() { }
}
如果方法隐藏需要 new 关键字,那么您的代码现在无法编译!将 new 关键字设置为可选意味着您现在需要担心的只是一个新警告。
EDIT
正如埃里克·利珀特(Eric Lippert)在评论中指出的那样,“值得担心的新警告”大大低估了警告的目的,即“挥舞大红旗”。我写这篇文章的时候一定很匆忙。当人们本能地将警告视为可以容忍的烦恼而不是将其视为有用的信息时,这很烦人。
EDIT 2
我终于找到了这个答案的来源,当然,这是埃里克的帖子之一:https://stackoverflow.com/a/8231523/385844 https://stackoverflow.com/a/8231523/385844
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)