继承链如下:
class A
{
public virtual void Foo()
{
Console.WriteLine("A's method");
}
}
class B:A
{
public override void Foo()
{
Console.WriteLine("B's method");
}
}
class C:B
{
public new virtual void Foo()
{
Console.WriteLine("C's method");
}
}
class D:C
{
public override void Foo()
{
Console.WriteLine("D's method");
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
class Program
{
static void Main(string[] args)
{
A tan = new D();
tan.Foo();
Console.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
结果是,调用了B类中的方法foo().
但在参考中:
调用虚方法时,将检查对象的运行时类型是否有覆盖成员.如果没有派生类重写成员,则调用派生程度最大的类中的重写成员,该成员可能是原始成员.
在我的逻辑中,CLR首先发现Foo()
是一个虚方法,它查看D
运行时类型的方法表,然后它发现在这个最派生的类中有一个重写成员,它应该调用它并且永远不会意识到有一个new Foo() …
我在读这本书CLR via C#
的Jeffrey Richter
。
在Chapter 23(23.3.2)
,它说"A System.Type object represents a type reference(as opposed to a type definition)."
这里的类型引用和类型定义是什么意思?