Перегрузка метода - PullRequest
       8

Перегрузка метода

4 голосов
/ 18 декабря 2008

У меня есть следующий пример кода:

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

Производное 1: MyMethod - Int 5

Производное1: MyMethod - Double 5

Для третьего вызова MyMethod с использованием objD почему используется перегрузка DOUBLE, когда я фактически передаю ему INT.

Второй вызов с использованием objBD, похоже, работает правильно. Пожалуйста, предложите.

Ответы [ 3 ]

8 голосов
/ 18 декабря 2008

Как ни странно, я обсуждал это с Джоном в тот вечер! Существует проблема приоритета - переопределенный метод определен в базовом классе, поэтому для целей «наилучшего метода» перегрузка (даже с неявным приведением) является предпочтительной, поскольку она определяется в большинстве тип (подкласс).

Если вы повторно объявите метод (new), тогда он получит приоритет, но вы не можете override и new метод с тем же именем и подписью в том же типе - вы бы для достижения этого нужно добавить дополнительный уровень наследования.

Точная логика для этого подробно описана в 14.5.5 и 14.4.2 в ECMA 334 v4.

По сути, чтобы сделать базовый метод вызываемым, вам нужно либо привести его к базовому типу, либо добавить метод shim:

public void MyMethod2(int param) {base.MyMethod(param);}
0 голосов
/ 18 декабря 2008

Я сделал следующее изменение как предложено:

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

Выход не меняется

База: MyMethod - Int 5

Производное 1: MyMethod - Int 5

Производное1: MyMethod - Double 5

0 голосов
/ 18 декабря 2008

Я предполагаю, что при вызове MyMethod (5), 5 может быть как double, так и int, а double имеет более высокий приоритет. Вы пытались вызвать MyMethod ((int) 5)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...