C# C语言中的动态绑定#

C# C语言中的动态绑定#,c#,dynamic-binding,C#,Dynamic Binding,如何在内部分配引用,引用A包含引用B? 有人能解释发生了什么吗?你的C类WhoAreYou()方法是“新的”,因此对B隐藏了该方法。这意味着D类中的重写是重写C的方法,而不是重写B的方法(重写A的方法) 由于您有一个对a的引用,所以它的WhoAreYou()函数的层次结构中最底层的是类B中的引用 在类C中,方法WhoAreYou()不会覆盖基类方法,因为它是用new关键字定义的,该关键字添加了一个具有相同名称的新方法,隐藏了基类方法。这就是为什么: class A { public v

如何在内部分配引用,引用A包含引用B? 有人能解释发生了什么吗?

你的C类WhoAreYou()方法是“新的”,因此对B隐藏了该方法。这意味着D类中的重写是重写C的方法,而不是重写B的方法(重写A的方法)

由于您有一个对a的引用,所以它的WhoAreYou()函数的层次结构中最底层的是类B中的引用


在类
C
中,方法
WhoAreYou()
不会覆盖基类方法,因为它是用
new
关键字定义的,该关键字添加了一个具有相同名称的新方法,隐藏了基类方法。这就是为什么:

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" !!!!
调用
D
中被重写的方法,该方法重写用
new
关键字定义的基类方法

但是,当目标类型为
A
时,则:

C c = new D();
c.WhoAreYou();// "I am a D"

调用
B
中被重写的方法,当您在
a
类型的
a
上调用其方法被
B

重写时,这意味着

A a = new D();
a.WhoAreYou();// "I am a B" !!!!
打破了虚拟方法的链条


当你通过A的引用调用D的WhoAreYou()方法时,虚拟开始工作,但在C处中断。

嗯,我可能错了,但我认为这就是发生的情况。当您声明类D的对象并将其分配给类C时,类C有一个虚函数,在这种情况下,它将只使用D的覆盖函数。但是,当您声明类D的对象并将其分配给类a时,发生的情况是因为D从C继承,C从B继承,B最终从a继承,但同时覆盖a,那么您就有了打印语句。如何:阅读msdn并尝试理解虚拟/覆盖/新机器?你的例子很清楚@Flo:在第一种情况下,对象C具有对D的引用,它调用D的方法。但在第二种情况下,显然A引用了D,而方法调用它如何调用B的方法(内部发生的事情)。。安静的混乱。
new virtual
在概念上有意义吗,你的预期结果是什么?@Matthew:显然隐藏了基类实现,让派生的重写。谢谢你的回复Nawaz。A引用了D,A不知道它的子类。所以,我必须从导出的一个开始跟踪。是这样吗?如果不是意味着。。但如果D的引用如何调用B的方法,以及它如何跟踪A(在方法表方面)的派生类(如内部内容),则会更好。。
public new virtual void WhoAreYou(){}