我对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
设置为“那是父母”?我可能误解了C#中的方法重载。有没有办法强制代码使用Child调用(将str1设置为“That is a Child”)?
答案 0 :(得分:7)
为什么str1设置为“那是父母”?
因为重载(通常)是在编译时确定的,而不是执行时间。它完全基于目标和参数的编译时类型,但使用dynamic
值的调用除外。
在您的情况下,参数类型为Parent
,因此它会调用MyClassName(Parent)
有没有办法强制代码使用Child调用(将str1设置为“That is a Child”)?
两个选项:
p
声明为Child
类型,而不是Parent
p
声明为类型dynamic
,这将强制在执行时执行重载决策答案 1 :(得分:2)
方法重载解决方案发生在编译时,而虚拟方法覆盖解决方案发生在运行时。< / p>
您MyClassName()
的来电正在编译时解决Parent
重载,因为p
的类型为Parent
。由于Child
对象实际上也是Parent
的实例(由于继承),因此这不是问题。 (请注意p instanceof Parent
为真,即使p
引用了Child
个对象。)