这个方法重载是什么意思?

4

我有一个关于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")?


重载方法:为什么基类被赋予优先权? - BradleyDotNET
2个回答

7
为什么str1会被设置为“这是一个父类”?
因为通常情况下,重载是在编译时而不是执行时确定的。它基于目标和参数的编译时类型,仅在使用dynamic值的情况下除外。
在您的情况下,参数类型是Parent,因此调用MyClassName(Parent)。
有办法强制代码使用Child调用(将str1设置为“这是一个Child”)吗?
两个选择:
1.将p声明为Child而不是Parent类型
2.将p声明为dynamic类型,这将强制在执行时执行重载分辨率。

选项3:调用单个方法,然后检查类型。 - Kyle W
哇,我以前从未遇到过在 Excel com interop 调用之外使用 dynamic 的用途。谢谢。 - user2023861

2
方法重载的解析发生在编译时,而虚方法覆盖的解析发生在运行时
由于变量p的类型是Parent,所以你对MyClassName()的调用将在编译时被解析为Parent重载。由于Child对象实际上也是Parent的一个实例(因为继承),所以这不是一个问题。(请注意,即使p引用了一个Child对象,p instanceof Parent也是true。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接