Использование ключевого слова 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)