2012-04-21 2 views
4

ОК, после вчерашнего вечера я решил перефразировать мой вопрос для более легкого чтения. У меня есть 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

Я думаю, что ваш призыв сделать их разными для ясности показывает, почему имеет смысл давать им разные имена. «Почти то же самое» имеет другое значение для «семантически то же самое». Интерфейс должен отражать использование; если реализация двух функций аналогична, но их назначение отличается, тогда имеет смысл использовать разные имена, чтобы избежать путаницы. Например, функция «replace» может быть реализована почти так же, как функция «найти», но не имеет смысла давать им одно и то же имя. –

ответ

2

Если Battlegroups использовался только для хранения предметов, вы можете использовать battlegroup battlegroupobject[100] прямо в поле Army. Или используйте std::vector<battlegroup> вместо battlegroups. Если нет (и в любом случае), ваше решение кажется вполне правильным, потому что существуют разные обязанности этих объектов.

0

не очень уверен, что ваш дизайн, но вот я думаю: вы хотите иметь Army, Navy и т.д. Тогда вы можете наследовать Army, Navy от Battlegroups, так что вам не нужно писать AddBattleGroup и RemoveBattleGroup для всех классов для Army, Navy и т. д. Примерно:

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

Если это не то, что вы хотите, вы можете рассмотреть ответ Дмитрия.

Смежные вопросы