当前位置:  开发笔记 > 编程语言 > 正文

方法重载行为

如何解决《方法重载行为》经验,为你挑选了1个好方法。

我有以下代码示例:

public class Base
{
   public virtual void MyMethod(int param)
    {
        Console.WriteLine("Base:MyMethod - Int {0}", param);
    }
}

public class Derived1 : Base
{
    public override void MyMethod(int param)
    {
        Console.WriteLine("Derived1:MyMethod - Int {0}", param);
    }

    public void MyMethod(double param)
    {
        Console.WriteLine("Derived1:MyMethod - Double {0}", param);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Base objB = new Base();
        objB.MyMethod(5);

        Base objBD = new Derived1();
        objBD.MyMethod(5);

        Derived1 objD = new Derived1();
        objD.MyMethod(5);

        Console.ReadLine();
    }
}

上面代码的输出如下:

基地:MyMethod - Int 5

Derived1:MyMethod - Int 5

Derived1:MyMethod - Double 5

对于使用'objD'第三次调用'MyMethod',为什么在我实际传递INT时使用'DOUBLE'重载.

使用'objBD'的第二次调用似乎行为正确.请建议.



1> Marc Gravell..:

奇怪的是,那天晚上我和乔恩正在讨论这个问题!有一个优先级问题 - 重写的方法是在基类中定义的,因此出于"最佳方法"的目的,重载(即使使用隐式转换)是优选的,因为它是在最具体的类型(子类)中定义的).

如果你重新声明了方法(new),那么它将获得优先权,但你不能overridenew同一类型中具有相同名称和签名的方法 - 你必须添加额外的继承级别来实现这一点.

对此的确切逻辑在ECMA 334 v4的14.5.5和14.4.2中有详细说明.

基本上,要使基本方法可调用,您必须强制转换为基类型,或者添加填充方法:

public void MyMethod2(int param) {base.MyMethod(param);}

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有