日期:2014-05-16  浏览次数:21069 次

关于虚实例方法与非虚实例方法的调用
非虚实例方法:

internal class A
    {
        public  void Show()
        {
            Console.WriteLine("A");
        }
    }

    internal class B : A
    {
        public new void Show()
        {
            Console.WriteLine("B");
        }
    }

    internal  class C : B
    { 
    
    }


虚实例方法

internal class A
    {
        public virtual void Show()
        {
            Console.WriteLine("A");
        }
    }

    internal class B : A
    {
        public override void Show()
        {
            Console.WriteLine("B");
        }
    }

    internal  class C : B
    { 
    
    }

对于同样的调用

A a = new C();
 a.Show();

第一个结果:A
第二个结果:B

谁能透彻的讲解下,讲下原理,不要三两句搪塞
------解决方案--------------------
CLR调用一个类型的实例方法时会先判断这个方式是否是可被重写的虚方法,如果只是普通方法,那就直接调用,如果是虚方法,那就在继承链上查找实际类型的最终重写版本。

复现一下这个过程,调用类型A的show()方法,先查找是否是虚方法,
第一种情况不是虚方法,那么直接调用A的show()方法
第二种情况发现了A的show方法是virtual,可重写的,那么就在继承链上找到A的实际类型C的该方法最终重写版本,也就是B重写的Show()方法。
------解决方案--------------------
这两者没有可比性。
所谓的“非虚拟”,其实不过是一种极端方式下避免两个不相干的类的同名方法的冲突而制定的语法规则。

你只要记住一条,如果你不使用虚拟方法,你的派生类永远得不到改写它的机会。