4

我有以下代码示例:

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 - 双 5

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

使用“objBD”的第二次调用似乎表现正确。请建议。

4

3 回答 3

8

奇怪的是,前几天晚上我正在和乔恩讨论这个问题!有一个优先级问题——被覆盖的方法是在基类中定义的,所以为了“最佳方法”的目的,重载(即使是隐式转换)是更可取的,因为它是在最具体的类型(子类)中定义的)。

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

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

基本上,要使基本方法可调用,您要么必须转换为基本类型,要么添加 shim 方法:

public void MyMethod2(int param) {base.MyMethod(param);}
于 2008-12-18T11:09:32.003 回答
0

我猜想在调用 MyMethod(5) 时,5 也可以是 double 或 int,并且 double 具有更高的优先级。您是否尝试过调用 MyMethod((int)5)?

于 2008-12-18T10:57:55.037 回答
0

我按照建议做了以下更改:

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

输出不变

基数:MyMethod - Int 5

Derived1:MyMethod - Int 5

Derived1:MyMethod - 双 5

于 2008-12-18T11:14:17.593 回答