2012-04-21 26 views
4

好的,昨晚之后,我决定改写我的问题以便阅读。 我有2个班级,陆军和战斗群。继承人下面的类,尽管有一些零件丢失:多个班级,相同的公共接口

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

功能名称不同的事实似乎表明它们在您的设计中是*不同的,即使其中一个的实现只是调度到另一个。在未来,您可能想要重构并以其他方式实现它......如果它们在您的设计中相同,为什么名称不同? – 2012-04-21 19:07:16

+0

为了清晰起见,我让它们有所不同,但它们几乎完成相同的功能 – 2012-04-21 19:11:34

+2

我认为,为了清晰起见,让它们变得不同的呼叫说明了给它们命名的理由。 “几乎相同”与“语义相同”有不同的含义。界面应该反映使用情况;如果两个功能的实现类似但其用途不同,那么使用不同名称以避免混淆是有意义的。例如,'replace'函数可能与'find'函数几乎相同,但给它们起同样的名字是没有意义的。 – 2012-04-21 20:44:28

回答

2

如果Battlegroups仅用于包含对象,则可以使用代替Army。或者使用std::vector<battlegroup>而不是battlegroups。如果不是(并且无论如何),你的决定看起来非常正确,因为这些对象有不同的责任。

0

不是很确定自己的设计,但这里是我的猜测:你想拥有ArmyNavy等等,那么你可能要继承ArmyNavyBattlegroups,这样你就不需要写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(); 

如果这不是你想要的,你可能要考虑德米特里的答案。