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

Aar*_*ide 29 c# warnings virtual-functions

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

class A
{
    public virtual void F() { }
}
class B : A
{
    public void F() { }
}
Run Code Online (Sandbox Code Playgroud)

然后你得到警告:

'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'关键字,那么我的程序功能是否会有所不同?

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

Jon*_*eet 25

不,new除了是否给出警告外,默认行为与您使用的完全相同.根据我的经验,你更多的时候居然要指定override,而不是new,因为它通常只是忘记明确覆盖的情况.

如果你真的这样做需要一个完全独立的方法,如果你有选择使用不同的名称,而不是,我会采取这种做法.使一种方法隐藏另一种方法通常会显着降低IMO的可读性.如果目的只是提供一个更具体的返回类型(并确保更弱的类型化方法返回相同的值),这并不是糟糕,但这是一个非常罕见的情况.


Fad*_*man 22

它不会做任何事情,但你有F()的方法也不是多态的.如果你开始使用基类引用就会很容易在代码中出错,因此你会收到警告.当然它可以是你想要的,因此新关键字只是使它更明确

例如

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

A b2 = new B();
b2.F(); // will call A.F()
Run Code Online (Sandbox Code Playgroud)

现在,如果你添加类Cnew,它会表现得一样B.如果添加类Doverride,则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()
Run Code Online (Sandbox Code Playgroud)

看到这个小提琴.

  • 在VS上尝试一下,但我相信它会调用AF() (2认同)