在C#中转换类

时间:2012-12-01 03:23:26

标签: c# casting

我有一个问题,为什么在这段代码中,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");
    }
}

2 个答案:

答案 0 :(得分:5)

这是因为Two()不是虚方法。如果您专门查看Two()的实例,则从B类调用的唯一时间B。调用A时,类Two()没有虚拟方法的查找表,因此没有人知道在其他地方查找其他方法。

您可以在我对this question的回答中看到更多详细信息。

答案 1 :(得分: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