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

C# 多态性:被调用方法的真正类型是什么?,c#,polymorphism,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() {

有人能解释一下这段代码的行为吗?因为我在玩多态性,我碰巧想到了这段代码,我真的对它的行为感到困惑:

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

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

如果您更改了
public新的void方法()
对于public
override void Method()
它将打印出另一行

见:

返回值

类型:System.Type

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


new
破坏多态性。这就是
new
的全部要点,实际上就是隐藏虚拟实现


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

不太需要基于调用位置返回静态类型的方法,因为您更容易掌握这些信息。