2012-04-21 19 views
4

ok、昨夜の後、私は読書を容易にするために質問を言い換えることにしました。 私は陸軍と戦闘の2つのクラスを持っています。以下HERESにクラス、いくつかの部分が欠落しているとはいえ:複数のクラス、同じ公開インタフェース

class Battlegroups 
{ 
    private: battlegroup battlegroupobject[100]; 

    public: 

    void AddBattleGroup(); //add a battlegroup object to the array 
    void removebattlegroup(); //remove a battle group objects from the array 
}; 

class Army 
{ 
    private: battlegroups battlegroupsobject; 

    public: 

    void formbattlegroup() 
    { 
     battlegroupsobject.AddBattleGroup(); 
    } 

    void disbandbattlegroup() 
    { 
     battlegroupsobject.removebattlegroup(); 
    } 
}; 

参照は、問題がformbattlegroup()とその無意味インタフェースを追加することのように思えるdisbandbattlegroup()、です。

上記を実行せずにAddbattlegroupおよびremovebattlegroup()メソッドにアクセスする手段がある場合は、教えてください。

またはこれがあなたのやり方であるかどうかを私に教えてください。コードのために、コードを追加するようです。

+0

関数の名前が異なるという事実は、関数の名前が実装で異なる場合、たとえその実装が他のものにディスパッチされているとしても、あなたの設計において*異なる*であることを示すようです。将来、あなたはリファクタリングして、それをどうにかして実装したいかもしれません...あなたのデザインに同じものがあれば、名前はどうして違いますか? –

+0

私はそれらを分かりやすくするために別のものにしましたが、同じ機能をほとんど果たしています –

+2

明瞭にするためにそれらを異なるものにするというあなたの呼びかけは、なぜ彼らに異なる名前を付けるのが理にかなっているのかを示しています。 「ほぼ同じ」は「意味的に同じ」とは異なる意味を持つ。インターフェイスには使用方法が反映されている必要があり2つの機能の実装が似ているがその目的が異なる場合、混乱を避けるために異なる名前を使用するのが理にかなっています。たとえば、 'replace'関数は 'find'関数とほぼ同じように実装できますが、同じ名前を付けるのは意味がありません。 –

答えて

2

Battlegroupsがオブジェクトを格納するためにのみ使用される場合は、代わりにArmybattlegroup battlegroupobject[100]を使用することができます。またはbattlegroupsの代わりにstd::vector<battlegroup>を使用してください。そうでない場合(そしてとにかく)、これらのオブジェクトの責任が異なるため、あなたの決定はかなり正しいように見えます。

0

非常にあなたのデザインについて確認が、ここではなく、私の推測です:あなたはArmyを持ちたい、Navyなどそして、あなたはBattlegroupsからArmyNavyを継承することをお勧めします、あなたはAddBattleGroupRemoveBattleGroupを書く必要がないようにArmyNavyなどのクラスごとに。次のように:これはないあなたが望むものである場合

class Battlegroups 
{ 
    // side-note: you may want to replaced below by std::vector<battlegroup> 
    private: battlegroup battlegroupobject[100]; 

    public: 

    void AddBattleGroup(); 
    void RemoveBattleGroup(); 
}; 

class Army 
: public Battlegroups 
{ 
    // other specific implementations 
}; 

class Navy 
: public Battlegroups 
{ 
    // other specific implementations 
}; 

// usage 
Army army1; 
army1.AddBattleGroup(); 
Navy navy1; 
navy1.AddBattleGroup(); 

、あなたはドミトリーの答えを検討する必要があります。

関連する問題