2014-09-03 53 views
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设置为“这是家长”?我可能误解C#中的方法重载。有没有办法强制代码使用Child调用(将str1设置为“That's a Child”)?

+0

仅供参考:http://stackoverflow.com/questions/13095544/overloaded-method-why-is-base-class-given-precedence – BradleyDotNET 2014-09-03 20:55:31

回答

7

为什么STR1被置为“这是一个家长”?

因为重载是(通常)确定在编译时间,而不是执行时间。它完全基于目标和参数的编译时类型,但使用dynamic值的调用除外。

在你的情况下,参数类型为Parent,所以它调用MyClassName(Parent)

有没有办法来强制代码中使用儿童调用(STR1设定为“这是一个孩子”)?

两个选项:

  • 声明pChild型的,而不是Parent
  • 声明pdynamic型的,这将迫使重载解析在执行时执行
+0

选项3:调用单个方法,然后检查类型。 – 2014-09-03 20:59:56

+0

哇,我以前从来没有遇到过使用Excel com互操作调用之外的'dynamic'功能。谢谢。 – user2023861 2014-09-03 21:01:25

2

方法过载分辨率发生在编译时,而虚拟方法重写分辨率发生在运行时

由于的类型为Parent,因此您在​​的调用正在编译时解决到Parent过载。由于Child对象实际上也是Parent的实例(由于继承),所以这不是问题。 (注意:p instanceof Parent是真实的,即使p引用一个Child对象。)