【问题标题】:which overloaded method would it use?它会使用哪种重载方法?
【发布时间】:2012-03-27 11:45:03
【问题描述】:

例如我们有

     BaseClass myBaseObject
     InheritedClass myInheritedObject

和 2 个重载方法

     void Do(BaseClass tmp)
        { DoA();}
     void Do(InheritedClass tmp)
        { DoB();}

这会做什么?

     Do((BaseClass) myInheritedObject);

DoA() 放在BaseClass 下,将DoB() 放在InheritedClass 下并覆盖DoA(),并将2 个Do() 合并为1,这是一种常见的技术吗?

        void Do(BaseClass tmp)
           {return tmp.DoA()}

【问题讨论】:

  • 第一个,因为参数的类型完全对应它的签名
  • 为什么要问何时可以在编写此问题所需的相同时间内在编译器中检查自己?
  • 一种方法是自己在一个快速的控制台应用程序中检查它...
  • @OferZelig:使用快速控制台应用程序检查会给他答案,但 SO 答案会给他原因。理解总比知道好,不是吗?
  • @Falanwe 你是对的,如果那是他所要求的。他问:“这有什么用?”而不是“为什么要调用第一种方法?”这是 Jon Skeet 详细阐述的绝对合理的答案。这不仅仅是语义上的问题,这家伙实际上并没有自己尝试,也不知道答案是什么,而是在 SO what 发生而不是 why 中询问一些结果发生了。

标签: c# polymorphism overloading


【解决方案1】:

第一个 - 第二个重载不适用,因为参数的编译时类型是BaseClass 而不是InheritedClass,并且没有从BaseClassInheritedClass 的隐式转换。

【讨论】:

  • 所以 Do(myInheritedObject) 会调用 DoB()?
  • @colinfang:是的,假设myInheritedObject编译时类型InheritedClass。当然,你可以很容易地自己尝试。
  • thx,我的问题现在变成了解决这个问题,你能帮忙看看吗? stackoverflow.com/questions/9892660/…
猜你喜欢
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多