Подскажите, пожалуйста, как такое можно реализовать, у меня вообще нет идей.
Есть интерфейсы
Unit
и
Lane
. Методом
Lane::place(Unit *)
можно разместить
Unit
на
Lane
. Нужно чтобы на добавление
Unit
на
Lane
, у
Unit
вызывался колбэк (напр.
onPlaced(Lane *)
).
Проблемы в том, что:
- этот колбэк опционален и не каждая реализация
Unit
должна иметь его
- существует много реализаций
Lane
и на каждую нужно иметь разные колбэки (напр. onPlaced<SkyLane>(Lane *)
, onPlaced<GroundLane>(Lane *)
и т.д.)
Eдинственное рабочее что пришло в голову
Если реализации Unit
будет нужен колбэк, то пусть реализует интерфейс с колбэком (PlacedOnSkyLane
, PlacedOnGroundLane
и т.д.), реализует нужный колбэк (onPlacedOnSkyLane
, onPlacedOnGroundLane
и т.д.).
В методе Lane::place(Unit *)
пытаемся привести аргумент к интерфейсу с колбэком (используя dynamic_cast
) и если успешно, вызываем колбэк.
В этом решении мне не нравится наличие RTTI, то как Unit *
приводится к интерфейсу с колбэком, а ещё то, что для каждой реализации Lane
нужно делать свой такой интерфейс (а реализаций много, на данный момент 7).