![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
AtroX |
|
|||
Unregistered |
Есть иерархия с базовым классом 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. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Назвать себя человеком, хорошо знающим C++, мне не позволит ни скромность, ни знания, но что-то, на мой взгляд, странноват дизайн, предложенный тобой. Наверное я просто не понял, чего ты хочешь добиться, отказавшись от наследования? Тебе нужен механизм диспетчеризации в runtime, или что?
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Тоже не совсем понял, что требуется... Система подписки на события? Может, Boost.Signals пойдет? Насчет быстродействия не знаю... Если это действительно hard-realtime, то вряд ли, но десятки вызовов в секунду выдюжит... в зависимости от тяжести самих ф-ций, конечно.
P.S. Имхо, термин traits употреблен не к месту. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Ничего не понял
![]() AtroX
И причем тут real-time? Real-time - это не всегда есть быстродействие. Real-time - это прежде всего предсказуемость. З.Ы.: немного оффтопа ![]() Система реального времени (RTOS) это информационная система , в которой корректность выходной информация зависит не только от примененных алгоритмов, но и от моментов времени появления информации. И система реального времени необязательно быстрая, как кто либо мог считать. Не следует удивляться, что RTOS медлительнее, чем обычные ОС. Например, система навигации корабля в начале могла бы показаться не системой реального времени, потому что скорость мала и обычно "достаточно" времени (порядка минут) для принятия решения. Тем не менее, это действительно система реального времени. Это, я так ![]() ![]() З.Ы.Ы.: не в обиду конечно ![]() |
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Я чего-то не понял, или же после замены наследования на делегирование разные экземпляры entity будут по-разному себя вести, и уже не будет никакого наследования вообще?
Зачем нужна ИЕРАРХИЯ свойств? Их должен быть НАБОР. В чем проблема-то? Ну создавай сущность, задавай ей свойства, где тут виртуальные вызовы? Если только апгрейды всякие делать, но оно тем же самым агрегированием решается... Не пойму, про что вообще топик... Не дорос еще, наверно, тоже... |
|||
|
||||
AtroX |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
Курс ОС я прошел в полном объеме, так что я в этом разбираюсь ;) real-time пишу, поскольку основная масса людей это понимает, как то, что от приложения требуется максимальная производительность и реактивность.
Traits назвал потому, что они позволяют Entity приобретать новые свойства.
И как это делать в runtime?
Именно! Нужно иметь простой способ (минимум кода), чтобы сделать перенаправление вызовов функций Entity в функции Trait (коих может быть несколько) В общем то меня вчера посетило вдохновение и я написал, что-то подходящее, если интересно могу опубликовать. Но все равное есть надежда на простое и элегантное решение, типа применить некую комбинацию паттернов и т.п. |
||||||||
|
|||||||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
ПОДМЕНОЙ УКАЗАТЕЛЕЙ НА СВОЙСТВА! Именно таким образом агрегирование и может заменить наследование. И только таким (вроде). |
|||
|
||||
AtroX |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
Надо было мне полнее процитировать первый раз, а то неувязочка получается. Меня собственно и заинтерисовало, как задавать свойства без механизма виртуальных вызовов. ![]() |
||||
|
|||||
Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
AtroX, было бы интересно посмотреть, как ты решил проблему.
Это сообщение отредактировал(а) Chaos A.D. - 22.8.2005, 08:09 --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Вообще не совсем понял задачу, но может тебе поможет паттерн Visitor?
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
AtroX |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
Так оно применяется (что вполне меня устраивает): main.cpp
Собственно то, что позволило так кратенько все записывать, хотя я думаю, что все это нафиг переделаю MemberFn.h
entity.h
trait.h
В принципе, можно обойтись без динамического выделения памяти в makeTraitFn. Это была первая версия ![]() |
||||||||||
|
|||||||||||
AtroX |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
Для этого придется решить задачу |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |