如果我不注意警告“隐藏inheritance成员怎么办? 要使当前成员覆盖该实现……“

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

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

然后你得到警告:

'EomApp1.BF()' hides inherited member 'EomApp1.AF()'.
To make the current member override that implementation, add the override keyword. Otherwise use the new keyword.

错误消息的图像

问题:如果我什么都不做,警告我会发生什么警告? 如果我添加’new’关键字,那么我的程序function是否会有所不同?

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

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

例如

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

现在,如果使用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 CF() A c2 = new C(); c2.F(); // will call AF() D d1 = new D(); d1.F(); // will call DF() A d2 = new D(); d2.F(); // will call DF() 

看到这个小提琴 。

不,除了是否给出警告之外,默认行为与使用new行为完全相同。 根据我的经验,你经常想要指定override而不是new ,因为它通常只是忘记显式覆盖的情况。

如果你确实想要一个完全独立的方法,并且如果你可以选择使用不同的名称,那么我会采用这种方法。 使一种方法隐藏另一种方法通常会显着降低IMO的可读性。 如果目的只是给出一个更具体的返回类型(并确保更弱的类型化方法返回相同的值),这并不是糟糕,但这是一个非常罕见的情况。

看看这是否有一个很好的理由隐藏inheritance的成员? 。

这只是警告。 代码将有效。 在某些情况下,此警告可能会导致一些问题。

使用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