![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 29.06.2013
Сообщений: 132
|
![]()
Я уже прошёл эту тему по сути. Но очередной раз столкнувшись призадумался и не понял надобности такого подхода. Зачем создавать переменную типа базового класса, хранящую ссылку на экземпляр производного класса?
Например, PHP код:
Проще тогда сразу создать переменную базового типа, хранящую ссылку на экземпляр базового класса. В таком случае тоже данной переменной будут доступны только поля и методы базового класса... Почему нет? Последний раз редактировалось hoz; 07.02.2015 в 10:25. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
![]()
Представьте классический пример: вы пишете классы геометрических фигур.
Пусть будет Circle, Rectangle и Ellipse. Все они наследуются от базового типа (класса или интерфейса) Shape. У Shape есть виртуальный метод вычисления площади GetSquare(), переопределенный по-своему в каждом наследнике. Теперь представьте, что у вас есть List<Shape> - некая коллекция для неких целей (типа вам необходимо хранить сразу все разные Shape'ы в одном месте). Обчно коллекция используется для вычисления, скажем, общей площади (используется метод базового типа). Но бывают случаи, когда вам при некоторых условиях нужно получить более конкретные данные: например, для всех прямоугольников, большей площади чем 10, вывести размеры. Как сделать такую задачу без приведения типов? Никак, в данной ситуации, потому что базовый тип Shape не хранит данных о размере прямоугольника. Придётся приводить элемент коллекции к более конкретному типу. Пример для описанной задачи: Код:
Изобретатель велосипедов
Последний раз редактировалось Selestis; 07.02.2015 в 10:45. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Например, для полиморфизма.
Код:
Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
![]() |
![]() |
![]() |
#4 | |
Форумчанин
Регистрация: 16.01.2015
Сообщений: 672
|
![]()
ТС-у надо про ООП почитать, а то вот такие перлы
Цитата:
при чем тут экземпляр базового и как он будет соотноситься с тем что действительно надо? а надо от DerivedClass... |
|
![]() |
![]() |
![]() |
#5 | |
Форумчанин
Регистрация: 29.06.2013
Сообщений: 132
|
![]()
Я этим и занимаюсь. ООП слишком обширная тема. Конкретнее...
Цитата:
Например: PHP код:
PHP код:
|
|
![]() |
![]() |
![]() |
#6 | |
Форумчанин
Регистрация: 29.06.2013
Сообщений: 132
|
![]()
Selestis, с коллекциями я не знаю ещё. Сложный у Вас пример. Хотя кое-что я всё-таки понял. Благодарю за столь подробный ответ.
Цитата:
PHP код:
|
|
![]() |
![]() |
![]() |
#7 | ||
Форумчанин
Регистрация: 16.01.2015
Сообщений: 672
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
![]()
Если ваш пример ограничивать тем, что вы создаете объект-потомок и храните его в переменной с типом его предка, а затем хотите вызвать метод потомка, то конечно смысла в этом нет) Скорее всего этот пример привели в вашем источнике только для демонстрации, поэтому вам и не ясно его практическое применение.
Если вы ещё не дошли в изучении до полиморфизма, то лучше сначала просмотреть эту тему - потом сразу всё станет ясно. Суть в том, что метод предка может работать по-разному в разных потомках, так что вы можете и не знать кем именно является объект, используя его функциональность.
Изобретатель велосипедов
|
![]() |
![]() |
![]() |
#9 | |
Форумчанин
Регистрация: 29.06.2013
Сообщений: 132
|
![]() Цитата:
Я написал вот код простой: PHP код:
По сути, как я понял, нам и не важно то, что методы потомков не вызываются из предка, так? Нам важно, чтоб потомок целиком выполнялся, и, именно, целиком! Так? Т.е. если выполнять целиком его, то он нормально отрабатывается. А реализация скрывается от посторонних глаз? Например, в библиотеках... Или ещё какие-то причины есть? |
|
![]() |
![]() |
![]() |
#10 | |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
![]() Цитата:
Код:
P.S. это и есть полиморфизм
Изобретатель велосипедов
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Макрос для приведения к одному, одинаковому размеру графиков | REztor | Microsoft Office Excel | 2 | 23.12.2012 22:28 |
Битва экстрасенсов. Приведения, души и т.д. | TwiX | Свободное общение | 5 | 30.10.2011 15:22 |
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов | Lanx | Помощь студентам | 0 | 06.04.2011 20:24 |
Приведение к типу | __Demon__ | Общие вопросы C/C++ | 1 | 27.09.2009 17:40 |
Проблема приведения типов | Dec(Leprosus) | Общие вопросы C/C++ | 14 | 08.05.2008 04:24 |