|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.02.2015, 10:15 | #1 |
Форумчанин
Регистрация: 29.06.2013
Сообщений: 132
|
О надобность приведения к типу
Я уже прошёл эту тему по сути. Но очередной раз столкнувшись призадумался и не понял надобности такого подхода. Зачем создавать переменную типа базового класса, хранящую ссылку на экземпляр производного класса?
Например, PHP код:
Проще тогда сразу создать переменную базового типа, хранящую ссылку на экземпляр базового класса. В таком случае тоже данной переменной будут доступны только поля и методы базового класса... Почему нет? Последний раз редактировалось hoz; 07.02.2015 в 10:25. |
07.02.2015, 10:41 | #2 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
Представьте классический пример: вы пишете классы геометрических фигур.
Пусть будет Circle, Rectangle и Ellipse. Все они наследуются от базового типа (класса или интерфейса) Shape. У Shape есть виртуальный метод вычисления площади GetSquare(), переопределенный по-своему в каждом наследнике. Теперь представьте, что у вас есть List<Shape> - некая коллекция для неких целей (типа вам необходимо хранить сразу все разные Shape'ы в одном месте). Обчно коллекция используется для вычисления, скажем, общей площади (используется метод базового типа). Но бывают случаи, когда вам при некоторых условиях нужно получить более конкретные данные: например, для всех прямоугольников, большей площади чем 10, вывести размеры. Как сделать такую задачу без приведения типов? Никак, в данной ситуации, потому что базовый тип Shape не хранит данных о размере прямоугольника. Придётся приводить элемент коллекции к более конкретному типу. Пример для описанной задачи: Код:
Изобретатель велосипедов
Последний раз редактировалось Selestis; 07.02.2015 в 10:45. |
07.02.2015, 10:43 | #3 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Например, для полиморфизма.
Код:
Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
07.02.2015, 11:41 | #4 | |
Форумчанин
Регистрация: 16.01.2015
Сообщений: 672
|
ТС-у надо про ООП почитать, а то вот такие перлы
Цитата:
при чем тут экземпляр базового и как он будет соотноситься с тем что действительно надо? а надо от DerivedClass... |
|
07.02.2015, 12:15 | #5 | |
Форумчанин
Регистрация: 29.06.2013
Сообщений: 132
|
Я этим и занимаюсь. ООП слишком обширная тема. Конкретнее...
Цитата:
Например: PHP код:
PHP код:
|
|
07.02.2015, 12:19 | #6 | |
Форумчанин
Регистрация: 29.06.2013
Сообщений: 132
|
Selestis, с коллекциями я не знаю ещё. Сложный у Вас пример. Хотя кое-что я всё-таки понял. Благодарю за столь подробный ответ.
Цитата:
PHP код:
|
|
07.02.2015, 12:45 | #7 | ||
Форумчанин
Регистрация: 16.01.2015
Сообщений: 672
|
Цитата:
Цитата:
|
||
07.02.2015, 13:51 | #8 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
Если ваш пример ограничивать тем, что вы создаете объект-потомок и храните его в переменной с типом его предка, а затем хотите вызвать метод потомка, то конечно смысла в этом нет) Скорее всего этот пример привели в вашем источнике только для демонстрации, поэтому вам и не ясно его практическое применение.
Если вы ещё не дошли в изучении до полиморфизма, то лучше сначала просмотреть эту тему - потом сразу всё станет ясно. Суть в том, что метод предка может работать по-разному в разных потомках, так что вы можете и не знать кем именно является объект, используя его функциональность.
Изобретатель велосипедов
|
07.02.2015, 20:10 | #9 | |
Форумчанин
Регистрация: 29.06.2013
Сообщений: 132
|
Цитата:
Я написал вот код простой: PHP код:
По сути, как я понял, нам и не важно то, что методы потомков не вызываются из предка, так? Нам важно, чтоб потомок целиком выполнялся, и, именно, целиком! Так? Т.е. если выполнять целиком его, то он нормально отрабатывается. А реализация скрывается от посторонних глаз? Например, в библиотеках... Или ещё какие-то причины есть? |
|
07.02.2015, 21:03 | #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 |