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

私はそれを機能させていますが、船と船のグループに対してのみ機能します。Group コード (追加、削除、表示など) を再利用したいので、具体的な Group クラス (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の s を作成するには、「インターフェイス」(純粋仮想クラス) を作成して、それ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 に答える