任何人都可以解释这段代码的行为,因为我正在玩多态,我巧妙地想出了这段代码,我真的对它的行为感到困惑:
public class Book
{
public virtual void Method()
{
Console.WriteLine("Book/ I am here in "+ GetType().Name);
}
}
class Chapter : Book
{
public new void Method()
{
Console.WriteLine("Chapter/ I am here in "+ GetType().Name);
}
static void Main()
{
Book myBook = new Chapter() ;
myBook.Method();
}
}
此程序的输出是
预订/我在本章
这意味着该实例在book类中调用了该方法,但获取了类型chapter
。
GetType()
方法取决于它调用的实例,而不是它所在的类吗?
答案 0 :(得分:1)
是的,GetType()
在运行时从对象(实例)获取实际类型。
如果您更改了public new void Method()
公开override void Method()
它会打印另一行。
请参阅MSDN:
返回值
输入:System.Type
当前实例的确切运行时类型。
答案 1 :(得分:1)
new
破坏多态性。事实上,这就是new
的全部意义 - 隐藏虚拟实现。
如果要更改派生类型中方法的实现,则需要使用override
而不是new
。这将确保即使在编译时不知道正确的类型也会调用overriden方法。