2012-04-11 14 views
2

は、私は、オブジェクトのグループを持つことができますので、Compositeパターンを追加するために探しています。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という共通の基底クラスから継承するデザインを変更しようとしましたが、私はダイヤモンドプログラムに直面しました。

私はタイプに基づいて、私のグループの制御コードを再利用については行くことができる方法はありますか?

+0

これは私には、複合のように見えない...そこにダイヤモンドの問題について

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

心配はありませんオブジェクトの –

答えて

3

Sim_objectsを継承し、構成する必要があり、Sim_object複数のタイプで動作するために、コンポジット:

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のために、「インタフェース」(純粋仮想クラス)を作成し、を継承することができも同様です。

+0

どのような種類を:あなたはまた、クライアントコードで具体的なShipするのではなく、あなたの新しいインターフェイスを使用したいですグループクラスのコンテナは保持されますか?私はそれがテンプレートだ理解し、しかしShip_groupグループを使用して、そこから派生したときに、私のコンテナは抽象クラスのオブジェクトを保持しようとしているので、私はエラーを取得します。 – keelerjr12

+0

それはうまくいったはずです。とにかく、私はそれを 'Group 'に変更しました。再帰的コンポジット(グループのグループ...)を使用する場合は 'Group 'を使用してください。どのようなエラーがありましたか?どのようなコードですか? –

+0

問題Imはどのクラスがどの責任を担っているかを知っています。コンポジットパターンでは、クライアントは1つのクラスとインターフェースを取って、船舶と船舶のグループを処理する必要があります。私はShip_like作業を得た。しかし、今私はどこでAdd()/ Remove()を処理するか分からない。私はShip_likeオブジェクトを取得し、そのオブジェクトを追加または削除できるようにしたい。 Ship_likeにAdd/Remove機能を追加する必要がありますか?私は、船の追加/削除時にクライアントインターフェイスとコードのどの部分が関係するのか推測します。私は名前に基づいたオブジェクトを取得することができますので、同様に、私は、関数)(また、私はGET_OBJECTいる – keelerjr12