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方法()
对于publicoverride void Method()
它将打印出另一行
见:
返回值
类型:System.Type
当前实例的确切运行时类型
new
破坏多态性。这就是new
的全部要点,实际上就是隐藏虚拟实现
如果要更改派生类型中方法的实现,则需要使用
override
而不是new
。这将确保即使在编译时不知道正确的类型,也会调用重写的方法。不太需要基于调用位置返回静态类型的方法,因为您更容易掌握这些信息。