什么';It’这个方法正在重载
本文关键字:方法 重载 It 什么 | 更新日期: 2023-09-27 18:20:37
我有一个关于C#中方法重载的问题。我有一个家长班和一个孩子班。
class Parent
{
public virtual string GetMyClassName()
{
return "I'm a Parent";
}
}
class Child : Parent
{
public override string GetMyClassName()
{
return "I'm a Child";
}
}
我在这两个类之外声明了两个静态方法,它们作用于任何一种类型的对象:
static string MyClassName(Parent parent)
{
return "That's a Parent";
}
static string MyClassName(Child child)
{
return "That's a Child";
}
当我测试这些方法是如何调用的时,我得到了一个我认为奇怪的结果:
Parent p = new Child();
var str1 = MyClassName(p); // = "That's a Parent"
var str2 = p.GetMyClassName(); // = "I'm a Child"
为什么str1
设置为"That’s a Parent"?我可能误解了C#中的方法重载。有没有办法强制代码使用Child调用(将str1设置为"That's a Child")?
为什么str1被设置为"That's a Parent"?
因为重载(通常)是在编译时确定的,而不是执行时。它完全基于目标和参数的编译时类型,使用dynamic
值的调用除外。
在您的情况下,参数类型是Parent
,因此它调用MyClassName(Parent)
有没有办法强制代码使用Child调用(将str1设置为"That's a Child")?
两种选择:
- 将
p
声明为类型Child
,而不是Parent
- 将
p
声明为dynamic
类型,这将强制在执行时执行重载解析
方法重载解析发生在编译时,而虚拟方法override的解析发生在运行时。
您对MyClassName()
的调用在编译时被解析为Parent
重载,因为p
的类型是Parent
。由于Child
对象实际上也是Parent
的实例(由于继承),所以这不是问题。(请注意,即使p
引用Child
对象,p instanceof Parent
也是真的。)