如果我不注意警告“隐藏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