这可能是一个很好的观点,但它涉及编译器在您执行以下操作时发出的警告:
class A
{
public virtual void F() { }
}
class B : A
{
public void F() { }
}
然后你会收到警告:
'EomApp1.B.F()' hides inherited member 'EomApp1.A.F()'.
To make the current member override that implementation, add the override keyword. Otherwise use the new keyword.
问题:如果我什么都不做,警告我会发生什么警告?如果我添加'new'关键字,那么我的程序功能会不同吗?
(注意:我知道我可以很容易地测试这个,但我认为这里值得一试)
答案 0 :(得分:25)
不,默认行为与使用new
完全相同,除了是否给出警告。根据我的经验,您经常 想要指定override
而不是new
,因为它通常只是忘记明确覆盖的情况。
如果你真的做想要一个完全独立的方法,如果你有选项使用不同的名称,我会采取这种方法。有一种方法隐藏另一个通常会大大降低IMO的可读性。如果目的只是给出一个更具体的返回类型(并且确保更弱的类型化方法返回相同的值),那么太不好了,但这是一种非常罕见的情况。
答案 1 :(得分:21)
它不会做任何事情,但你有F()的方法也不是多态的。如果你开始使用基类引用就会很容易在代码中出错,因此你会收到警告。当然它可以是你想要的,因此新关键字只是让它更明确
E.g。
B b1 = new B();
b1.F(); // will call B.F()
A b2 = new B();
b2.F(); // will call A.F()
现在,如果您使用C
添加课程new
,则其行为与B
相同。如果您使用D
添加课程override
,则F
会变为多态:
class C : A
{
public new void F() { }
}
class D : A
{
public override void F() { }
}
// Later
C c1 = new C();
c1.F(); // will call C.F()
A c2 = new C();
c2.F(); // will call A.F()
D d1 = new D();
d1.F(); // will call D.F()
A d2 = new D();
d2.F(); // will call D.F()
请参阅this fiddle。
答案 2 :(得分:3)
答案 3 :(得分:0)
这只是警告。代码将起作用。在某些情况下,此警告可能会导致一些问题。
将 new 关键字与您从基类调用的方法一起使用。
class A
{
public virtual void F() { }
}
class B : A
{
new public void F() { }
}
https://msdn.microsoft.com/en-us/library/435f1dw2.aspx
https://msdn.microsoft.com/en-us/library/aa691135(v=vs.71).aspx