不同类型的复合模式重用

时间:2012-04-11 19:10:10

标签: c++ inheritance design-patterns composite

扩展海军模拟项目,我正在寻找添加复合模式,以便我可以拥有一组对象。这是当前层次结构的样子:

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的公共基类继承的设计,但我遇到了钻石程序。

我有什么方法可以根据类型重复使用我的组控制代码吗?

1 个答案:

答案 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()
}

不用担心钻石问题......