2

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

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
};  

我有它的工作,但它只适用于船舶和船舶组。我想重用组代码(添加、删除、显示等),这样一个具体的组类(如 Island_group)就可以从中继承并使用它。我尝试更改 Ship_group 类从名为 Group 的公共基类继承的设计,但我遇到了一个菱形程序。

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

4

1 回答 1

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

不用担心那里的钻石问题...

于 2012-04-11T19:56:54.823 回答