Это мое приложение для моделирования полета снова. Сейчас я покидаю простой этап прототипирования и начинаю разрабатывать дизайн программного обеспечения. По крайней мере, я стараюсь.Использовать множественное наследование для различения ролей использования?
У каждого из самолетов в симуляции есть связанный с ними план полета, точный характер которого не представляет интереса для этого вопроса. Достаточно сказать, что операторский способ редактировать план полета во время симуляции. Самолетная модель большую часть времени должна только считывать объект плана полета, который сначала считал необходимым просто передать ссылку на константу. Но, предположительно, самолет должен будет позвонить AdvanceActiveWayPoint()
, чтобы указать, что точка пути достигнута. Это повлияет на Iterator, возвращаемый функцией ActiveWayPoint()
. Это означает, что модель самолета действительно нуждается в неконстантной ссылке, которая, в свою очередь, также предоставит модели самолета модели AppendWayPoint()
. Я хотел бы избежать этого, потому что я хотел бы обеспечить соблюдение правила использования, описанного выше во время компиляции.
Обратите внимание, что class WayPointIter
эквивалентен итератору STL const, то есть точка не может быть мутирована итератором.
class FlightPlan
{
public:
void AppendWayPoint(const WayPointIter& at, WayPoint new_wp);
void ReplaceWayPoint(const WayPointIter& ar, WayPoint new_wp);
void RemoveWayPoint(WayPointIter at);
(...)
WayPointIter First() const;
WayPointIter Last() const;
WayPointIter Active() const;
void AdvanceActiveWayPoint() const;
(...)
};
Моей идеей преодолеть проблему является следующее: определить абстрактный класс интерфейса для каждой роли использования и наследовать FlightPlan от обоих. Затем каждый пользователь получает только ссылку на соответствующую роль использования.
class IFlightPlanActiveWayPoint
{
public:
WayPointIter Active() const =0;
void AdvanceActiveWayPoint() const =0;
};
class IFlightPlanEditable
{
public:
void AppendWayPoint(const WayPointIter& at, WayPoint new_wp);
void ReplaceWayPoint(const WayPointIter& ar, WayPoint new_wp);
void RemoveWayPoint(WayPointIter at);
(...)
};
Таким образом, декларация FlightPlan
нужно только быть изменен на:
class FlightPlan : public IFlightPlanActiveWayPoint, IFlightPlanEditable
{
(...)
};
Что вы думаете? Есть ли какие-нибудь пропахи, которых я могу пропустить? Является ли эта конструкция ясной или мне придумать что-то другое для ясности?
В качестве альтернативы я мог бы также определить специальный класс ActiveWayPoint
, который будет содержать функцию AdvanceActiveWayPoint()
, но считайте, что это может быть ненужным.
Заранее благодарен!
Спасибо! Возможность включения протоколирования и дополнительных проверок является точкой, которую я считаю очень ценным дополнением. – Arne