多态性:被调用方法的真实类型是什么?

时间:2016-06-03 09:30:23

标签: c# polymorphism

任何人都可以解释这段代码的行为,因为我正在玩多态,我巧妙地想出了这段代码,我真的对它的行为感到困惑:

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()方法取决于它调用的实例,而不是它所在的类吗?

2 个答案:

答案 0 :(得分:1)

是的,GetType()在运行时从对象(实例)获取实际类型。

如果您更改了public new void Method() 公开override void Method()它会打印另一行。

请参阅MSDN

  

返回值

     

输入:System.Type

     

当前实例的确切运行时类型。

答案 1 :(得分:1)

new破坏多态性。事实上,这就是new的全部意义 - 隐藏虚拟实现。

如果要更改派生类型中方法的实现,则需要使用override而不是new。这将确保即使在编译时不知道正确的类型也会调用overriden方法。