小编Cla*_*Tan的帖子

CLR会检查整个继承链以确定要调用哪个虚方法吗?

继承链如下:

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() …

.net c# inheritance

21
推荐指数
2
解决办法
1315
查看次数

类型定义和类型引用有什么区别?

我在读这本书CLR via C#Jeffrey Richter

Chapter 23(23.3.2),它说"A System.Type object represents a type reference(as opposed to a type definition)."

这里的类型引用和类型定义是什么意思?

c# clr

5
推荐指数
1
解决办法
663
查看次数

标签 统计

c# ×2

.net ×1

clr ×1

inheritance ×1