如果我不理会警告“隐藏继承成员。为了使当前成员覆盖该实现……”会发生什么?

44

这可能是一个微小的细节,但它涉及到编译器在你执行如下操作时发出的警告:

class A
{
    public virtual void F() { }
}
class B : A
{
    public void F() { }
}

然后你会得到以下警告:

'EomApp1.B.F()' 隐藏了继承成员 'EomApp1.A.F()'
要使当前成员重写该实现,请添加 override 关键字。否则请使用 new 关键字。

错误消息截图

问题:这个警告实际上在警告我如果我不采取任何行动会发生什么? 如果我添加 'new' 关键字和不添加关键字,我的程序会有不同的功能吗?

(注意:我知道我可以轻松测试这个,但我觉得在这里提问也是值得的)

3个回答

31

它什么也不做,但你所写的方法F()也不是多态的。如果你开始使用基类引用,代码中很容易出现错误,因此你会受到警告。当然,这可能是你想要的,因此使用new关键字可以使其更加明确。

例如:

B b1 = new B();
b1.F(); // will call B.F()

A b2 = new B();
b2.F(); // will call A.F()

现在,如果你使用new添加类C,它将与B的行为相同。如果你使用override添加类D,那么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()

请查看 此Fiddle


2
在VS上试一下,但我相信它会调用A.F()。 - Fadrian Sudaman

27

不,除了是否给出警告之外,默认行为与使用new的行为完全相同。根据我的经验,你更常常实际上想要指定override而不是new,因为通常只是忘记明确地进行覆盖。

如果你真的希望有一个完全独立的方法,并且如果你有使用不同名称的选项,我会采取那种方式。在我看来,一个方法隐藏另一个方法通常会显著降低可读性。如果目的只是提供更具体的返回类型(并确保较弱类型的方法返回相同的值),那么情况就没有太大问题,但这是一个非常罕见的情况。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接