Зачем вам маскировать член базового класса?

Я только что научился маскировать член базового класса (используя new), но не понимаю, почему я хотел бы это сделать . Обеспечивает ли маскирование определенный уровень защиты, как в случае использования инкапсуляции? Пожалуйста, сообщите.

8
задан Asterix 31 August 2010 в 14:43
поделиться

4 ответа

Вы очень редко будете использовать "новый" для маскировки члена базового класса.

Он в основном используется в тех случаях, когда член производного класса сначала был членом, а затем он был добавлен к базовому классу — с тем же именем для другой цели. новое заключается в том, что вы признаете, что знаете, что используете его по-другому. Когда в C++ добавляется базовый член, он просто молча объединяет существующий метод в цепочку наследования. В C# вам придется выбирать между новым и переопределением, чтобы показать, что вы знаете, что происходит.

3
ответ дан 5 December 2019 в 12:53
поделиться

Он используется не только для маскировки. Это фактически разрывает цепочку наследования, поэтому, если вы вызываете метод базового класса, метод в производном классе не будет вызываться (только тот, что в базовом классе).

По сути, вы создаете новый метод, который не имеет ничего общего с методом базового класса. Отсюда и «новое» ключевое слово.

Имея это в виду, ключевое слово «new» можно использовать, если вы хотите определить метод с той же сигнатурой, что и у метода базового типа, но с другим типом возвращаемого значения.

3
ответ дан 5 December 2019 в 12:53
поделиться

Я только что научился маскировать член базового класса (используя new)

К вашему сведению, эта функция обычно называется "скрытием", а не "маскированием". Я думаю о «маскировке» как об очистке битов в битовом массиве.

упускаю из виду, почему я хотел бы это сделать.

Обычно вы этого не хотите. По каким причинам использовать и не использовать эту функцию, см. мою статью на эту тему от 2008 года:

http://blogs.msdn.com/b/ericlippert/archive/2008/05/21/method-hiding-apologia .aspx

Обеспечивает ли маскирование определенный уровень защиты, как в случае использования инкапсуляции?

Нет, это не так.

3
ответ дан 5 December 2019 в 12:53
поделиться

То, о чем вы говорите, называется Сокрытием имени. В основном это функция удобства. Если вы наследуете от класса, исходный код которого не контролируете, использование new позволит вам изменить поведение метода, даже если он не был объявлен виртуальным (или полностью изменить сигнатуру, если она виртуальный). Ключевое слово new просто подавляет предупреждение компилятора. По сути, вы сообщаете компилятору, что намеренно скрываете метод от родительского класса.

В Delphi было reintroduce ключевое слово по той же причине.

Что это дает вам, кроме скрытого предупреждения? Не так много.Вы не можете получить доступ к новому методу из родительского класса. Вы можете получить к нему доступ из интерфейса, если ваш дочерний класс напрямую реализует интерфейс (в отличие от наследования его от родительского класса). Вы все равно можете вызвать член родительского класса из дочернего. Любые дополнительные потомки вашего класса будут наследовать новый элемент, а не член родительского класса.

1
ответ дан 5 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: