这个方法重载怎么回事?

时间:2014-09-03 20:50:19

标签: c# overloading

我对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”)?

2 个答案:

答案 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个对象。)