【发布时间】:2012-06-01 15:46:44
【问题描述】:
class A
{
public virtual void WhoAreYou() { Console.WriteLine("I am an A"); }
}
class B : A
{
public override void WhoAreYou() { Console.WriteLine("I am a B"); }
}
class C : B
{
public new virtual void WhoAreYou() { Console.WriteLine("I am a C"); }
}
class D : C
{
public override void WhoAreYou() { Console.WriteLine("I am a D"); }
}
C c = new D();
c.WhoAreYou();// "I am a D"
A a = new D();
a.WhoAreYou();// "I am a B" !!!!
内部如何分配引用,引用A包含B的引用? 谁能解释一下发生了什么?
【问题讨论】:
-
嗯,我可能错了,但我认为这就是正在发生的事情。当您声明 D 类的对象并将其分配给 C 类时 --- C 类有一个虚函数,在这种情况下,它只会使用 D 的覆盖函数。但是,当您声明 D 类的对象并将其分配给 A 类时,会发生什么,因为 D 从 C 继承,C 从 B 继承,B 最终从 A 继承,但同时覆盖 A,那么您就有了该 print 语句。跨度>
-
怎么样:阅读 msdn 并尝试了解 virtual/override/new-machine?你的例子很清楚!
-
@Flo:在第一种情况下,对象 C 具有 D 的引用,它调用 D 的方法。但在第二种情况下,显然 A 具有 D 的引用,而方法调用它如何调用 B 的方法(内部发生的事情).. 安静混乱..
-
new virtual在概念上是否有意义,您的预期结果是什么? -
@Matthew : 明明隐藏基类实现,让派生覆盖。
标签: c# dynamic-binding