Re[3]: "Хитрый" проход по контейнеру полиморфных элементов.
От: memory_leak  
Дата: 19.01.04 08:07
Оценка: +1
Подобные проблемы часто поддаются красивому решению при помощи паттерна Visitor.

1) надо сделать классы-наследники от game_object — draw_game_object, serialize_game_object и т.п. с соответствующими методами draw(), save()/load() и т.п. Менеджер должен об конкретных наследниках знать.
2) game_object должен обладать следующим интерфейсом:
...
public:
virtual void accept(Manager* mgr);
...

3) менеджер должен обладать следующим интерфейсом:
... 
public:
void process(draw_game_object* object);
void process(serialize_game_object* object);
// и т.п.
...

4) функцию accept() каждый наследник реализует как
...
mgr->process(this);
...

Передавая таким образом this как указатель на конкретного наследника
5) а в функциях process(...) менеджер может творить всё что угодно, ориентируясь на известные ему интерфейсы наследников game_object'a

Достоинства метода:
— никаких кастов, всё строится на таблице виртуальных функций
— легко расширяемо
— нет условных конструкций
— саму конструкцию process/accept можно вынести и спрятать очень далеко
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.