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)
现在,如果你添加类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()
Run Code Online (Sandbox Code Playgroud)
看到这个小提琴.
| 归档时间: |
|
| 查看次数: |
30139 次 |
| 最近记录: |