C # переопределить статические методы - PullRequest
0 голосов
/ 21 марта 2019

У меня есть следующие классы и методы

public class X
{
    public static void M1(...)
    {
        ...
        var isSomething = M2(...);
        ...
    }

    public static bool M2(...) { ... }
}

Мне нужно реализовать новый метод M2 с такой же сигнатурой, который будет вызываться в некоторых случаях.Чтобы сделать это, я думал о реализации нового класса Y, расширяющего X и переопределяющего метод M2, поэтому, когда я вызываю Y.M1 (), я хочу использовать y.M2 ().

public class Y : X
{
    public static [override] bool M2(...) { ... }
}

Но статические методы не могут быть переопределены.У кого-нибудь есть совет, как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Статические методы не могут быть переопределены. Динамическое связывание возможно только с экземплярами объекта.

Вы можете "скрыть" статические методы от базового класса с помощью ключевого слова new, как объяснено здесь . В вашем случае вы можете написать свой Y.M2 () в следующем стиле:

public class Y : X
{
    public static new bool M2(...) { ... }
}

Имейте в виду, что этот стиль отличается от нормального переопределения виртуального нестатического метода. При переопределении нестатического метода привязка метода выполняется во время выполнения в зависимости от фактического типа объекта. привязка статического метода выполняется во время компиляции.

1 голос
/ 21 марта 2019

Не совсем понятно, что вы пытаетесь сделать, но, насколько я понимаю ваш вопрос, вы хотите изменить поведение M1(), которое наследуется классом Y, другим статическим методом M2().Это невозможно, если все задействованные методы являются статическими, но вы можете получить желаемый эффект, если объявите M1() нестатичным.Это может быть сделано следующим образом:

public class X
    {
    public Boolean M1 (Int32 x1)
        {
        return M2 (x1);
        }
    public virtual Boolean M2 (Int32 x2)
        {
        return M3 (x2);
        }
    public static Boolean M3 (Int32 x2)
        {
        return x2 >= 0;
        }
    }

public class Y : X
    {
    public override Boolean M2 (Int32 x2)
        {
        return M3 (x2);
        }
    public static new Boolean M3 (Int32 x2)
        {
        return x2 < 0;
        }
    }

Вот тестовый пример:

Boolean fTest1 = new X ().M1 (1);
Boolean fTest2 = new Y ().M1 (1);

Console.Write ("{0} {1}", fTest1, fTest2);

Это выведет:

True False

Таким образом, метод оболочки M2(), который вызывает статический метод M3() в X, равен virtual и может быть переопределен в Y, вызывая другой статический метод M3().Следовательно, если вы используете экземпляр производного класса Y, вызов M2() внутри унаследованного метода M1() направлен на метод M2(), переопределенный внутри Y, который, в свою очередь, вызывает другойM3(), с желаемым изменением поведения - в этом примере результатом является обратное логическое значение.

...