Использование ключевого слова new при создании метода с такой же сигнатурой, что и в суперклассе?

Вернуться к CS101 очень быстро. Я пытаюсь расширить поведение метода Add в классе ConcurrentDictionary, В результате этого не будучи virtual или же abstract Я не должен отмечать это override Ключевое слово, я могу просто создать новую функцию в моем подклассе с той же подписью.

Хотя когда я делаю это, я замечаю визуальное студийное сообщение, говорящее

Используйте новое ключевое слово, если скрытие было предназначено.

Меняет ли использование этого ключевого слова способ выполнения метода при вызове из экземпляра подкласса?

Например, в приведенном ниже коде, если у меня есть экземпляр класса MyClassEx и я звоню Method1 затем Method1 в суперклассе не будет называться правильно (только если бы я сам назвал это base)?. С этим же случаем, если бы я позвонил Method2 тот же результат произойдет, только подкласс Method2 выполнит?

public class MyClass
{
    public void Method1() { Console.Out.WriteLine("MyClass.Method1"); }
    public void Method2() { Console.Out.WriteLine("MyClass.Method2"); }
}

public class MyClassEx : MyClass
{
    public void Method1()
    {
        Console.Out.WriteLine("MyClassEx.Method1");
        //base.Method1();
    }

    public new void Method2()
    {
        Console.Out.WriteLine("MyClassEx.Method2");
        //base.Method2();
    }
}

Использует new Ключевое слово таким образом, просто "хорошее кодирование" или это имеет какой-то эффект?

РЕДАКТИРОВАТЬ: Из того, что это выглядит, это просто "хорошее кодирование". Хотя это вызывает небольшое беспокойство. Я хочу создать новый Add метод в подклассе, чтобы изменить поведение ConcurrentDictionary метод. Хотя из связанных ответов кажется, что другой кодер мог обойти мою новую реализацию, просто ссылаясь на подкласс суперкласса.

MyClassEx mycex = new MyClassEx();
((MyClass)mycex).Method2();

В этом случае они могли бы назвать суперкласс Method2 (поведение по умолчанию) игнорируя поведение, которое я реализовал?

2 ответа

Решение

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

По сути, ключевое слово "new" заставляет компилятор / среду выполнения обрабатывать плоть, присвоенную псевдониму value/actor, как можно предположить из названия: new. Просто подумайте о недавно введенном необязательном ключевом слове "old" или "унаследованный", чтобы отметить обратное.

Предположим, что класс A определяет псевдоним a со значением 42. Предположим также, что класс B наследуется от класса A. Без какого-либо ключевого слова, но с учетом видимости, B ответит на "c = Ba", назначив 42 для c. Теперь давайте предположим, что класс C также наследует от класса A, но переопределяет псевдоним значения a с ключевым словом "new" и определяет "a = 666;" в его конструкторе. В-третьих, класс D снова наследует от класса A и определяет "a = 999;".

Теперь наследуйте классы B (BB), C (CC), D (DD) и запрашивайте значения a, соответственно. Пытаться!

"Новая" вещь - это новая вещь, которая не будет наследоваться. Используйте "virtual", "override" и т. П. Для копирования поведения C++.

Но имейте в виду, что наследование, как правило, плохо. Есть причина, почему C# не поддерживает слияние наследования. (B: A; C: A; D: B, C)

Другие вопросы по тегам