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的引用? 任何人都可以解释一下是怎么回事?
答案 0 :(得分:7)
在类C
中,方法WhoAreYou()
不会覆盖基类方法,因为它是使用new
关键字定义的,它添加了 new 方法使用相同的名称隐藏基类方法。这就是为什么:
C c = new D();
c.WhoAreYou();// "I am a D"
调用D
中的重写方法,该方法会覆盖用new
关键字定义的基类方法。
但是,当目标类型为A
时,则为:
A a = new D();
a.WhoAreYou();// "I am a B" !!!!
在B
中调用重写的方法,因为您调用a
类型为A
的方法,其方法被B
覆盖。
答案 1 :(得分:3)
你的C类WhoAreYou()方法是'new',因此隐藏了B中的那个。这意味着D类中的覆盖覆盖C的方法而不是B的(覆盖A的)。
由于你有一个A的引用,它的层次结构中最远的是WhoAreYou()函数是B类中的一个。
答案 2 :(得分:1)
这意味着,C的
public new virtual void WhoAreYou(){}
打破了虚拟方法链。
当您通过引用A调用D的方法WhoAreYou()时。虚拟性开始工作,但它在C处断开。