衍生自取代基称为虚拟方法(Virtual method called from derived in

2019-07-20 17:49发布

能否给我有人解释为什么当我投类进入基地之一被称为重写的方法:

    class Base
    {
        public virtual void VirtualMethod()
        {
            Console.WriteLine("Base virtual method");
        }
    }

    sealed class Derived : Base
    {
        public override void VirtualMethod()
        {
            Console.WriteLine("Overriden method");
        }
    }

    static void Main(String[] args)
    {
        Derived d = new Derived();
        ((Base)d).VirtualMethod();
    }

我的意思是代码打印:

Overriden method

并不是

Base virtual method

它运行时或编译时的未来?

我知道我可以通过调用派生调用基的虚方法base.VirtualMethod()但我可以把它从外面? (从像Main或某些其它类)

Answer 1:

该方法的实现是基于所述对象的执行时类型选择的。 这是它的点的很大一部分。 任何人都可以使用:

public void Foo(Base b)
{
    b.VirtualMethod();
}

......而无需知道或关心执行类型是什么,因为多态性会照顾它。

我知道我可以通过调用base.VirtualMethod()派生调用基的虚方法,但我可以把它从外面?

没有(至少没有一些可怕的两轮牛车来调用虚方法非虚拟),这是封装的故意一部分。 压倒一切的实现已经有效地替换该对象的原始实现。



Answer 2:

如果你想访问你不应该使用覆盖基本实现,你应该使用新的。 覆盖覆盖任何父类的实现,新的“隐藏”父类的实现,这样就可以通过铸造作为父对象,然后调用方法访问的实现。

internal class Program
{
    private static void Main(string[] args)
    {
        Derived d = new Derived();
        d.VirtualMethod();
        ((Base) d).VirtualMethod();

        Console.ReadLine();
    }

    private class Base
    {
        public virtual void VirtualMethod()
        {
            Console.WriteLine("Base virtual method");
        }
    }

    private sealed class Derived : Base
    {
        public new void VirtualMethod()
        {
            Console.WriteLine("Overriden method");
        }
    }
}

这将输出:

覆盖方法
基本虚拟方法



文章来源: Virtual method called from derived instead of base