3

我有一个问题,为什么在这段代码中,One() 方法是从 B 类执行的,而 Two() 方法是从 A 类执行的?我知道那是在做铸造,但我不明白它的工作方式。顺便说一句,任何具有这种技巧的好的链接或书籍都将不胜感激。比你。

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        A a = (A)b;

        a.One(); 
        a.Two(); 
    }
}

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

public class B : A
{
    public override void One()
    {
        Console.WriteLine("B One");
    }
    public new void Two()
    {
        Console.WriteLine("B Two");
    }
}
4

2 回答 2

5

这是因为Two()不是虚拟方法。唯一Two()会从类中调用的时间B是,如果您专门查看B. 类A在调用时没有虚拟方法的查找表,Two()因此没有人知道在别处寻找不同的方法。

您可以在我对这个问题的回答中看到更多详细信息。

于 2012-12-01T03:32:54.070 回答
0

Two() 方法在类 A 中不是虚拟的(因此它不允许被覆盖,几乎与您必须将 B.Two() 设为新的原因相同 - 否则编译器会抱怨)。

因此,当您在基类中没有虚拟方法时,它并不意味着被覆盖。因此,当您将 B 类型的对象转换为 A 类型时,对 Two() 方法的调用将绑定到 A 类型的方法表,而不是 B 类型。

你可以在这里读更多关于它的内容:

http://msdn.microsoft.com/en-us/library/6fawty39(v=vs.80).aspx http://www.akadia.com/services/dotnet_polymorphism.html

于 2012-12-01T03:35:20.737 回答