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