[英]c# 6 bug? virtual new method strange behavior
我有这个代码:
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Foo foo = new Foo();
Bar bar = new Bar();
Baz baz = new Baz();
Foo fooBar = new Bar();
Foo fooBaz = new Baz();
Bar barBaz = new Baz();
foo.Test();
bar.Test();
baz.Test();
fooBar.Test();
fooBaz.Test();
barBaz.Test();
Console.ReadLine();
}
}
internal class Foo
{
public virtual void Test()
{
Console.WriteLine("Foo");
}
}
internal class Bar : Foo
{
public new virtual void Test()
{
Console.WriteLine("Bar");
}
}
internal class Baz : Bar
{
public override void Test()
{
Console.WriteLine("Baz");
}
}
}
它输出我:
Foo
Bar
Baz
Foo
Foo
Baz
但是,我认为它应该是:
Foo
Bar
Baz
Foo
Baz
Baz
因为Baz压倒了这个方法。 这里发生了什么? 我错过了什么吗? 为什么fooBaz.Test()的输出是“Foo”而不是“Baz”?
Buz
压倒了这个方法,这就是原因
Bar barBaz = new Baz();
barBaz.Test();
将打印Baz
。
但是Bar
并没有覆盖 - 它隐藏了基本方法Test
并使新方法成为虚拟方法。 然后Baz
重写了Bar
的新方法,而不是来自Foo
的方法。 所以如果你像这样引用它: Foo fooBaz = new Baz();
然后fooBaz
被视为Foo
一个实例,它不知道隐藏方法。
如果您将public new virtual void Test()
更改为public override void Test()
则会生成您期望的输出。
另请参阅以下主题:
当你在Bar.Test
上使用new关键字时,你说它与Foo.Test
没有任何关系,除了它具有相同的名称。 由于Baz继承自Bar,它会覆盖Bar.Test
但Foo.Test
修改Foo.Test
。
当你调用fooBaz.Test
它会查找未修改的Foo.Test
方法并输出“Foo”。
当你调用barBaz.Test
它会查找覆盖的Bar.Test
方法并输出“Baz”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.