Подскажите, пожалуйста, как такое можно реализовать, у меня вообще нет идей.
Есть интерфейсы
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).