当运行时决定调用哪个overriden方法时,我不明白它们的含义

时间:2014-02-07 03:29:25

标签: c# inheritance virtual-method

多态性示例:

public class animal 
{
    public void virtual speak()
    {
        Console.WriteLine("Animals can speak in many ways.");
    }
}

public class dog : animal 
{
    public void override speak()
    {
        Console.WriteLine("I bark!");
    }
}

static void main()
{
    animal doggy = new dog();

    doggy.speak();
}

输出:

I bark!

我一直在读取在运行时调用正确的speak方法,但是它是否已经硬编码并且编译器是否根据虚拟和覆盖关键字无法识别它将调用哪个方法?

2 个答案:

答案 0 :(得分:3)

您的编译器不一定知道哪个实现将是基础类型。举个例子:

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

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

class Program
{
    static A GetImpl(int i)
    {
        switch(i)
        {
            case 1:
                return new A();
            case 2:
                return new B();
            default:
                // whatever
        }
    }

    static void Main(string[] args)
    {
        var i = int.Parse(Console.ReadLine());
        A a = GetImpl(i);
        a.F();
    }
}

编译器怎么可能知道是否返回了AB?它不能,因此调用正确方法的任务被委托给运行时。

答案 1 :(得分:1)

如果您的代码类似

Animal anAnimal= NoahsArc.getNextAnimal();
anAnimal.speak();

现在你实际上并不知道你将获得什么样的动物,因此运行时可以确保调用正确的speak方法。