如果我不注意警告“隐藏继承成员。如果使当前成员覆盖该实现......”

时间:2011-05-09 05:54:09

标签: c# warnings virtual-functions

这可能是一个很好的观点,但它涉及编译器在您执行以下操作时发出的警告:

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.

image of error message

问题:如果我什么都不做,警告我会发生什么警告?如果我添加'new'关键字,那么我的程序功能会不同吗?

(注意:我知道我可以很容易地测试这个,但我认为这里值得一试)

4 个答案:

答案 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