0 / 0 / 0
Регистрация: 06.01.2020
Сообщений: 76
|
|||||||||||||||||||||
В чём различие переопределения и сокрытия методов?10.05.2020, 16:02. Показов 3873. Ответов 2
Метки нет Все метки)
(
Например дан код:
Так же в примере почему то
0
|
10.05.2020, 16:02 | |
Ответы с готовыми решениями:
2
Отличия переопределения от сокрытия имен Как работается механизм переопределения методов в наследниках? Более правильный способ «динамического» переопределения виртуальных методов? |
![]() ![]() 17810 / 12961 / 3381
Регистрация: 17.09.2011
Сообщений: 21,250
|
||||||
10.05.2020, 16:27 | ||||||
Переопределенный метод вызывается в зависимости от фактического типа объекта.
Скрытый метод вызывается (или не вызывается) в зависимости от типа переменной или статически известного типа ссылки. Потому что скрытый метод вызывается только тогда, когда переменная/значение имеет тот же тип, в котором этот метод скрыт. Затем, что код может выглядеть и так:
0
|
![]() 1844 / 1186 / 501
Регистрация: 14.10.2018
Сообщений: 3,184
|
|||||||||||
10.05.2020, 17:13 | |||||||||||
![]() Решение
Писать можно так, как вам нужно, все дело в полиморфизме - одна из составляющих частей ООП
Полиморфизм Прежде чем отвечать поясню как он работает. У нас есть 2 вещи - ссылка и объект.
Person и объект типа Person Во 2-ом примере ссылка типа Person и объект типа Employee Ссылки базового класса могут ссылаться на объекты производных классов - это и есть полиморфизм. Но в чем разница? Если по 1-му примеру вопросов нет, то по 2-ом ответ таков: вы все также работаете с классом Employee , только с одним исключением - вызывать методы и данные можно только те, что есть в классе Person . Поле Name и свойство Display() - пожалуйста, поле Company - увы нельзя, почему так? Потому что ссылка Person не знает что такое поле существует. А какой из методов Display() будет вызван? Только тот, о котором ссылка Person знает, то бишь - базового класса. Однако эту проблему можно решить с помощью переопределения.Переопределение данных Ключевые слова virtual в базовом классе и override в классе наследнике отвечают за переопределение данных / методов. Если прописать эти 2 слова к методам Display() обоих классов, то результат работы этого метода при полиморфизме изменится. Возвращаемся к примеру
Display() помечен словом virtual , и начинает спускаться вниз по цепочке наследования от класса Person до класса Employee , если он встречает такой же метод со словом override , он он будет использовать именно эту версию метода. При длинной цепочке наследования (например в 10 классов) если хотя бы 1 класс не использует override , то будет вызван последний override -метод этой иерархииСкрытие данных Скрытие данных происходит с помощью слова new , если его нет - то компилятор сделает это сам, однако Visual Studio выдаст предупреждение (не ошибку). С помощью слова new вы делаете это явно (скажем так - это хороший стиль программирования и читать код проще). Скрытие данных полностью отрубает переопределение данных. Создается (в вашем случаи) новый метод, который называется точно также, как и в базовом классе. Можете рассматривать это примерно так - есть метод Display() и есть метод Display_1() . Они никак друг друга не касаются. Зачем это нужно? Когда вы называете переменную string Name - вы даете четкое понимание это это переменная хранит имя. В классе наследнике надо создать новую переменную (именно новую, при этом старая тоже нужна) и назвать ее точно также название Name . Как быть - скрыть старую.Еще одно отличие при скрытии данных - в вашем случаи будет создано два метода Display() , не смотря на то, что они имеют одинаковые названия.Также можно вызвать метод наследника с помощью слова base.Display() внутри метода Display() класса Employee .
0
|
10.05.2020, 17:13 | ||||||
Помогаю со студенческими работами здесь
3
Для достижения перегрузки и переопределения трех методов (использование класса с другим классом вариантов) В чем различие? В чем различие? В чем различие? в чем различие подскажите Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Работа с объемным DOM в javascript
Htext 04.04.2025
Сегодня прочитал статью тут о расходах памяти в JS, ее утечках и т. п. И вот что вспомнил из своей недавней практики. Может, кому пригодится. Хотя, в той статье об этом тоже есть.
Дело в том, что я. . .
|
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
|
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
|
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
|
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
|
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
|
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
|
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
|
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
|
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
|