扩展海军模拟项目,我正在寻找添加复合模式,以便我可以拥有一组对象。这是当前层次结构的样子:
class Sim_object {
};
class Ship : public Sim_object {
};
class Island : public Sim_object {
};
到目前为止,我已经提出了:
class Sim_object {
// holds general sim functions
get_name()
};
// COMPONENT
class Ship_object : public Sim_object {
// holds ship functions
add()
remove()
attack()
move()
};
// COMPOSITE
class Group : public Ship_object {
// holds list of group ship functions
add()
remove()
attack()
move()
};
// LEAF
class Ship : public Ship_object {
// holds ship functions
attack()
move()
};
class Island : public Sim_object {
// holds island functions
};
我有它工作,但它只适用于船舶和船舶组。我想重用组代码(添加,删除,显示等),然后一个具体的Group类(如Island_group)可以继承并使用它。我尝试更改Ship_group类从名为Group的公共基类继承的设计,但我遇到了钻石程序。
我有什么方法可以根据类型重复使用我的组控制代码吗?
答案 0 :(得分:3)
为了使用多种类型的Sim_object
,合并应该继承并撰写Sim_objects
:
class Sim_object { };
class Ship : public Sim_object { };
class Island : public Sim_object { };
class Group : public Sim_object {
add()
remove()
};
要将其定制为特定类型,您可以将其模板化,并(可能)从中派生出其他组:
template <class T>
class Group : public Sim_object {
add()
remove()
};
class Ship_Group : public Group<Ship> {
attack()
move()
};
class Island_Group : public Group<Island> { } // possibly unnecessary
现在,要拥有Ship_Group
替换Ship
,您可以为Ship
创建一个“接口”(纯虚拟类),并从中继承Ship_Group
好。您还可以在客户端代码中使用新界面而不是具体的Ship
:
class Ship_Like { // interface
attack() = 0
move() = 0
};
class Ship : public Sim_object, public Ship_Like { }; // concrete
class Ship_Group : public Group<Ship>, public Ship_Like {
attack()
move()
}
不用担心钻石问题......