Здравствуйте, Alxndr, Вы писали:
A>Боюсь, что это не решает самой проблемы, а именно: если завтра мне понадобится, чтобы менеджер умел выполнять над частью объектов еще пару операций (например, move(point), play_sound() etc.), снова придется лезть и переделывать game_object. Через несколько итераций мы получим "жирный" интерфейс: в классе game_object будет немалое количество методов-заглушек, созданных только для удовлетворения нужд какой-то ветви иерархии объектов
.
A>Если исходник game_object.hpp не мой, это усугубит проблему.
Вот твой вариант 1.b. Но реализованный более удобно:
class manager
{
...
public:
...
template <typename C> total_operation(void ( C::*method)() )
{
C *obj;
for (Iterator it = objects_.begin(); it != objects_.end(); it++)
{
obj = dynamic_cast<C*>(*it);
if (obj) (obj->*method)();
}
}
};
// где-то в коде:
// *** сериализация ***
manager_instance.total_operation<serializable_object>(&serializable_object::save);
// *** отрисовка ***
manager_instance.total_operation<drawable_object>(&serializable_object::draw);
У меня есть ещё несколько вариантов с шаблонами. Например, когда есть класс operation и его наследники, характеризующие выполняемые операции. В базовый класс игрового объекта в функцию make_operation передаётся нужная операция. Но этот вариант пока недоработанный (много спорных моментов).
... << RSDN@Home 1.1.2 stable >>