Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Traits, не для слабых умов =) |
Автор: AtroX 18.8.2005, 11:53 |
Есть иерархия с базовым классом entity, у которого есть некоторые виртуальные функции, типа ProcessMsg(int msg,..), ProcessInit(); Хочется заменить наследование агрегацией, это нужно, чтобы при выполнении можно было подключать дополнительные обработчики для виртуальных функций entity. (Аналог: множественное виртуальное наследование) Предполагается создание иерархии trait'ов, которым будут перенаправляться вызовы функций. Должны выполняться требования: 1) trait должен уметь делать почти все, что и наследник entity 2) trait не должен обрабатывать функции, если это не требутеся (*) 3) Простой процесс инициализации trait (регистрации пожеланий по обработке функций entity и т.п.) 4) Простой процесс деспетчеризации вызовов Можно сделать удобные define'ы или использовать механизм шаблонов. (*) А то можно создать иерархию trait с теми же виртуальными функциями, что и у entity и в entity в каждой виртуальной функции пробегаться по массиву trait'ов и вызывать соответствующие функции - это НЕ катит =) ОЧЕНЬ важно быстродействие, т.к. используется realtime! Некоторые виртуальные функции entity вызываются десятки раз в секунду. |
Автор: Chaos A.D. 18.8.2005, 13:11 |
Назвать себя человеком, хорошо знающим C++, мне не позволит ни скромность, ни знания, но что-то, на мой взгляд, странноват дизайн, предложенный тобой. Наверное я просто не понял, чего ты хочешь добиться, отказавшись от наследования? Тебе нужен механизм диспетчеризации в runtime, или что? |
Автор: Void 18.8.2005, 22:20 |
Тоже не совсем понял, что требуется... Система подписки на события? Может, http://www.boost.org/doc/html/signals.html пойдет? Насчет быстродействия не знаю... Если это действительно hard-realtime, то вряд ли, но десятки вызовов в секунду выдюжит... в зависимости от тяжести самих ф-ций, конечно. P.S. Имхо, термин traits употреблен не к месту. |
Автор: bel_nikita 19.8.2005, 00:50 | ||
Ничего не понял ![]() AtroX
И причем тут real-time? Real-time - это не всегда есть быстродействие. Real-time - это прежде всего предсказуемость. З.Ы.: немного оффтопа ![]() Система реального времени (RTOS) это информационная система , в которой корректность выходной информация зависит не только от примененных алгоритмов, но и от моментов времени появления информации. И система реального времени необязательно быстрая, как кто либо мог считать. Не следует удивляться, что RTOS медлительнее, чем обычные ОС. Например, система навигации корабля в начале могла бы показаться не системой реального времени, потому что скорость мала и обычно "достаточно" времени (порядка минут) для принятия решения. Тем не менее, это действительно система реального времени. Это, я так ![]() ![]() З.Ы.Ы.: не в обиду конечно ![]() |
Автор: Hroft 19.8.2005, 12:17 |
Я чего-то не понял, или же после замены наследования на делегирование разные экземпляры entity будут по-разному себя вести, и уже не будет никакого наследования вообще? Зачем нужна ИЕРАРХИЯ свойств? Их должен быть НАБОР. В чем проблема-то? Ну создавай сущность, задавай ей свойства, где тут виртуальные вызовы? Если только апгрейды всякие делать, но оно тем же самым агрегированием решается... Не пойму, про что вообще топик... Не дорос еще, наверно, тоже... |
Автор: AtroX 19.8.2005, 13:24 | ||||||||
Курс ОС я прошел в полном объеме, так что я в этом разбираюсь ;) real-time пишу, поскольку основная масса людей это понимает, как то, что от приложения требуется максимальная производительность и реактивность.
Traits назвал потому, что они позволяют Entity приобретать новые свойства.
И как это делать в runtime?
Именно! Нужно иметь простой способ (минимум кода), чтобы сделать перенаправление вызовов функций Entity в функции Trait (коих может быть несколько) В общем то меня вчера посетило вдохновение и я написал, что-то подходящее, если интересно могу опубликовать. Но все равное есть надежда на простое и элегантное решение, типа применить некую комбинацию паттернов и т.п. |
Автор: Hroft 19.8.2005, 13:32 | ||
ПОДМЕНОЙ УКАЗАТЕЛЕЙ НА СВОЙСТВА! Именно таким образом агрегирование и может заменить наследование. И только таким (вроде). |
Автор: AtroX 19.8.2005, 13:58 | ||||
Надо было мне полнее процитировать первый раз, а то неувязочка получается. Меня собственно и заинтерисовало, как задавать свойства без механизма виртуальных вызовов. ![]() |
Автор: Chaos A.D. 22.8.2005, 08:09 |
AtroX, было бы интересно посмотреть, как ты решил проблему. |
Автор: Chaos A.D. 22.8.2005, 17:46 |
Вообще не совсем понял задачу, но может тебе поможет паттерн Visitor? |
Автор: AtroX 22.8.2005, 18:31 | ||||||||||
Так оно применяется (что вполне меня устраивает): main.cpp
Собственно то, что позволило так кратенько все записывать, хотя я думаю, что все это нафиг переделаю MemberFn.h
entity.h
trait.h
В принципе, можно обойтись без динамического выделения памяти в makeTraitFn. Это была первая версия ![]() |
Автор: AtroX 22.8.2005, 23:29 | ||
Для этого придется решить http://forum.vingrad.ru/index.php?showtopic=62156 |