这是我的飞行模拟应用程序。我现在正离开纯粹的原型设计阶段,现在开始充实软件设计。至少我试试..使用多重继承来区分使用角色?
模拟中的每架飞机都有与之相关的飞行计划,其确切性质对此问题毫无兴趣。足以说运营商在模拟运行时编辑飞行计划。大多数时候飞机模型只需要读取飞行计划对象,这个对象起初被认为只是传递一个const引用。但有些情况下,飞机需要拨打AdvanceActiveWayPoint()
来表明已到达航点。这会影响函数ActiveWayPoint()
返回的迭代器。这意味着飞机模型确实需要一个非常量参考,这反过来也会将诸如AppendWayPoint()
之类的函数暴露给飞机模型。我想避免这种情况,因为我想在编译时强制执行上述使用规则。
请注意,class WayPointIter
等同于STL常量迭代器,也就是说迭代器不能改变点的方式。
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;
(...)
};
我的想法来克服这个问题是这样的:定义一个抽象接口类为每个使用的作用,从两个继承航班计划。然后,每个用户只会获得相应用户角色的引用。
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 2010-06-01 09:45:45