Интересная заморочка возникла. Как реализовать нечно вроде "вывернутого полиморфизма"?19.02.2013, 19:44. Показов 3524. Ответов 29
Метки нет (Все метки)
с "нормальным" все понятно: имея хэндл (или указатель) на базовый объект, вызывая виртуальный метод, мы получаем различное поведение, в зависимости от типа объекта, к которому привязан хэндл (на который указывает указатель).
а представим себе, что мы имеем хэндл базового класса, и хотим вызвать не его метод, а метод другого, "постороннего" класса, но не любой, а тот из перегруженных, который хочет получить объект именно того класса, который мы имеем в данный момент. немного запутанно, но ясно ![]() короче, нужно выполнить downcast, тогда вызывать перегруженный метод другого класса, и все сработает. мне ничего в голову не приходит (в данный момент с жавой), кроме instanceof. но "люди говорят", что если тебе понадобилось воспользоваться этой штукой, посмотри на свой дизайн, там что-то нехорошо пахнет. переделай и обойдешься без этого. вот прошу рассказать, как такое правильно осуществить по части дизайна. пример попробую привести: имеется базовый класс "мясо", от него "конина", "говядина", "свинина". имеется класс "повар", который, получив пакет с "мясом", должен в зависимости от того, что за мясо, приготовить или "лошадиную отбивную", или "бииф" какой-нибудь, или "свинину в томате". "красивый дизайн" - это когда "мясо" само себя готовит. "повар" получает "мясо" и вызывает его метод "анудавай!", и получает нужный продукт. но тогда какой он повар? вот ему (или кому-то) распознавать, что за мясо, и тогда уже... а для этого нужно использовать instanceof. но это нехорошо пахнет... не принюхиваться, пусть только работает, или что делать?
0
|
|
| 19.02.2013, 19:44 | |
|
Ответы с готовыми решениями:
29
Возникла интересная идея... Когда Маша и Витя покупали подарок возникла интересная ситуация Интересная задачка. Как реализовать ? |
|
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
| 19.02.2013, 20:23 | |
|
Есть замечательная заметка - When Polymorphism Fails - рассматривающая именно такую ситуацию
1
|
|
|
117 / 116 / 8
Регистрация: 23.12.2012
Сообщений: 195
|
|
| 20.02.2013, 00:25 | |
|
Так вроде для такого случая есть паттерн Strategy
Кстати, похожий пример рассматривается в этой статье.
0
|
|
|
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
|
||||||
| 20.02.2013, 08:16 | ||||||
|
Это мультиметоды называется, если я правильно понял суть проблемы.
0
|
||||||
| 20.02.2013, 13:09 [ТС] | |||
|
Добавлено через 37 минут
0
|
|||
| 21.02.2013, 15:55 | ||
|
0
|
||
| 21.02.2013, 18:29 | ||
![]() novi4ok, с чего это ты обобщил разные типы мяса? Вот если бы занимались перевозкой этого мяса, то скорее всего разницы в типе нет, а вот если что-то готовим, то тут уже нужно их различать ![]() В этой книжке есть красивый прием позволяющий определять что за типы без всяких там dynamic_cast
0
|
||
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 22.02.2013, 14:42 | |
|
По-моему, здесь как раз подходит паттерн Посетитель (Visitor).
Блюдо как раз является "посетителем" объекта Повар. А Повар знает, как именно нужно обработать конкретное Блюдо, - имеет разные методы обработки для Гуляша и для Плова. Блюдо, соответственно, содержит нужное количество конкретных Продуктов. Ну и если Официант требует приготовить Блюдо "вообще" (Абстрактное Блюдо) - тупо ругается "Ну не знаю я, как готовить Абстрактное Блюдо!" Нет?
0
|
|
| 22.02.2013, 19:34 [ТС] | |
|
в конце-концов, только для классических задачек из учебника можно подобрать классический пэттэрн из учебника.
а реально решаемые задачи не всегда укладываются в "прокрустово ложе пэттэрнов", и нужно руководствоваться здравым смыслом и создавать свои собстсенные. представьте себе, что исчезли все учебники с пэттэрнами, и их создали группу, которая будет разрабатывать новые. уверены, что они создадут те же самые? мир наш сложнее пэттернов, и не всегда красиво формализуется. конечно, если заранее известно, что мясо - только для того, чтобы из него что-нибудь готовить, то можно заранее (обязательно!) приложить рецепт, и повару не нужно будет знать подробности: он знает, что нужно их этого мяса достать бумажку и сделать все, что там написано. но если объекты уже есть, мы их не разрабадываем, и нам нужно их обрабатывать (или использовать для обработки) в зависимости от их типа, то не нужно стесняться, и писать instanceof столько раз, сколько производных классов нам известно. и да, если будут появляться новые - будем расширять, альтернативы не вижу.
0
|
|
|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|
| 22.02.2013, 21:23 | |
|
Думаю, у поваров в голове множество if-ов и/или switch-case-ов.
0
|
|
| 22.02.2013, 21:32 | |||||||||||||||||||||
|
TanaTiX, найди хотя бы один if/switch
Кликните здесь для просмотра всего текста
0
|
|||||||||||||||||||||
|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|
| 22.02.2013, 21:38 | |
|
Dmitriy_M, в плюсах не шарю, но if/switch не нашел. И к чему мне это? Вы же мне не трепанацию черепа повара предлагаете сделать...
0
|
|
| 22.02.2013, 22:04 [ТС] | |
|
не годится. ты цель ставил не мою задачку решить, а без ифов обойтись. не важно, решение полезно или нет.
повар получает указатель на базовый класс, а мясо не знает вообще, что где-то сущетсвует повар. т.е. повар получает три сорта мяса в одинаковых упаковках с надписью "мьасо", и в зависимости от того, что за сорт внутри, нужно принять решение. единственный вариант для повара это сделать - распечатать и посмотреть (т.е. instanceof), а потом "if ..."
0
|
|
| 22.02.2013, 22:34 | ||||||||||||||||
К примеру соевое мясо, то же мясо?
0
|
||||||||||||||||
| 23.02.2013, 10:25 | |||
|
0
|
|||
| 23.02.2013, 10:25 | |
|
Помогаю со студенческими работами здесь
20
Реализовать сложение двух чисел (с использованием полиморфизма) пожалуйста как реализовать стрельбу по полю что-то вроде морского боя Pascal ABC Заморочка со значение поля textaria, может кто знает как исправить
Есть класс, допустим NP. Нужно реализовать что то вроде такого: $np = new NP(). $np->senders->get(); Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|