繁体   English   中英

虚方法的重载解析

[英]Overload resolution of virtual methods

考虑代码

public class Base
{
   public virtual int Add(int a,int b)
   {
      return a+b;
   }
}

public class Derived:Base
{
   public override int Add(int a,int b)
   {
      return a+b;
   }

   public int Add(float a,float b)
   {
      return (Int32)(a + b);
   }
}

如果我创建 Derived class 的实例并使用 int 类型的参数调用 Add 为什么它使用 float 参数调用 Add 方法

Derived obj =new Derived()
obj.Add(3,5)

// why this is calling 
Add(float a,float b)

为什么它不调用更具体的方法?

这是设计使然。 C# 语言规范的第 7.5.3 节规定:

例如,方法调用的候选集不包括标记为覆盖的方法(第 7.4 节),如果派生 class 中的任何方法适用(第 7.6.5.1 节),则基 class 中的方法不是候选方法。

换句话说,因为您的Derived class 具有未覆盖的Add方法,所以Base class 中的Add方法(及其在Derived中的覆盖版本)不再是重载解决方案的候选者。

尽管Base.Add(int,int)会更好地匹配,但Derived.Add(float,float)的存在意味着编译器甚至不会考虑基本的 class 方法。

Eric Lippert 在这篇博文中讨论了这种设计的一些原因。

http://www.yoda.arachsys.com/csharp/teasers-answers.html

选择重载时,如果派生 class 中声明了任何兼容方法,则基 class 中声明的所有签名都将被忽略 - 即使它们在同一个派生类中被覆盖!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM