Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Резюме для программиста

20.09.21 13:13
Re: Резюме для программиста
 
alex445 свой человек
в ответ alex445 20.09.21 10:47, Последний раз изменено 20.09.21 13:15 (alex445)
По-моему, эти названия - new и override - ничего не говорят и выбраны неудачно. Я сколько ни читал описания в МСДН, что этот скрывает, а этот переписывает - так и не понял логики, почему один так называется, а другой так. Они оба скрывают и переписывают, только один в одном случае, а другой в другом. Если кто попытается понять, почему в этом случае вы назвали это сокрытием, а в другом - переписыванием, тот голову сломает и ничего не запомнит. На следующем собесе с каверзными вопросами вы этот вопрос завалите, если вы до этого постоянно эти конструкции не используете с присвоением производных классов базовым и проверке - а что там выводить будет.


По мне, так override скрывает метод базового класса, а new - переписывает. Это понятия, настолько зависящие от контекста, ну типа как разглядывание цифры "6" с противоположных сторон, что если заменить их на "шняжка" и "фигняшка", то в понимании ничего не ухудшится.


Потому что логические действия программы пытаются описать семантическими понятиями ключевых слов, взятых из естественного языка, который нифига не логичен.

Даже в МСДН либо почти нигде не объяснено, что означает "скрывает" и "переписывает", либо это разбросано в разных местах в разных примерах кода, так что в голове единая картина не складывается.


Почему, например, override переписывает, а new - скрывает? Взять из моего примера кода


new B().Method1();


Тут внутри метода 1 в базовом классе А вызывается метод 2 производного класса В, а не базового же класса А. Т.е. получается, что override скрыл метод 2 базового класса А? А почему "скрыл" используется для new?


А всё потому, что эта терминология используется для производного класса относительно базового. В производном классе override перезаписывает методы базового класса, а new - скрывает их. Если же мы находимся в базовом классе, то тут лучше использовать другие слова: при вызове базового члена из производного, override заставляет использовать производный член, а new - позволяет использовать базовый. Причём понятия "мы находимся в базовом" или "мы находимся в производном" классах - верны в любом случае. Т.е. что мы находимся в методе какого-то класса, что мы приводим тип.


Например, в случае


new B().Method1();


мы находимся в производном классе, вызываем метод базового, и внутри базового мызываем метод, который есть в обоих классах иерархии наследования, но в производном определён как override. Это заставляет использовать вместо базового метода производный. Т.е. override скрывает метод базового класса.


В случае


new C().Method1();


мы находимся в производном, вызываем метод базового, внутри него - метод, который есть в обоих классах в иерархии, но в производном определён как new. Это позволяет нам использовать в базовом классе базовую версию метода. Здесь new ничего не скрывает, а наоборот, позволяет использовать. Понятие скрывает к этому случаю неприменимо. Сокрытие new базовых членов применимо, когда мы находимся в производном классе и хотим вызвать член, которые есть в обоих классах в иерархии. В объяснениях же в МСДН и прочих переводных, которые обычно переводятся тупо и без осмысления, написана какая-то хрень и абракадабра, которую невозможно понять, т.к. всё описано несоответственно семантике употребляемых терминов, или не уточняется, в каком контексте мы находимся - в контексте базового класса, производного или это случай приведения типов, или случай вызова производного метода из базового метода из производного класса.

 

Перейти на