建模“可选”继承

时间:2009-11-19 23:54:35

标签: c++ inheritance

我在决定建立这种关系的方法时遇到了麻烦......

所有老板都可以做某些事情并拥有某些东西(速度,健康等),所以这些都是“主要”抽象老板班的一部分。

class Boss // An abstract base class
{
    //Stuff that all Bosses can do/have and pure virtual functions
};

现在我想为可以拍摄的老板指定一些更纯的虚拟功能和成员。我想知道我应该如何建模呢?我考虑过从Boss类派生一个ShootingBoss类,但是特定的老板本身就是类(Boss只是一个抽象的基类,它们来自。)因此,如果ShootingBoss来自Boss,而一个特定的boss来自ShootingBoss,那个老板将无法访问Boss类中的受保护数据。

Boss(ABC) -> ShootingBoss(ABC) -> SomeSpecificBoss(can't access protected data from Boss?)

基本上,我想知道推荐的建模方法是什么。任何帮助表示赞赏。如果需要更多信息,我很乐意提供。

3 个答案:

答案 0 :(得分:2)

我认为你需要研究Mixin类。

例如,您可以创建以下类:

class Boss {
    // Here you will include all (pure virtual) methods which are common
    // to all bosses, and all bosses MUST implement.
};

class Shooter {
    // This is a mixin class which defines shooting capabilities
    // Here you will include all (pure virtual) methods which are common
    // to all shooters, and all shooters MUST implement.
};

class ShootingBoss : public Boss, public Shooter
{
    // A boss who shoots!
    // This is where you implement the correct behaviour.
};

Mixins需要使用multiple inheritance,这样做有很多陷阱和复杂性。我建议您查看this one等问题的答案,以确保避免这些陷阱。

答案 1 :(得分:1)

为什么不开始使用接口?因此,不是简单的超级基类,而是将您的东西分散到各种能力中。

struct IBoss : public IObject
{
}
struct ICanShoot : public IObject
{
}

通常,要实现此功能,您可以从另一个接口派生接口,以便查询接口。

struct IObject
{
 int getId(); // returns a unique ID for this interface.
 int addRef();
 int release();
 bool queryInterface(int id, void** pp);
}

这样,您可以更轻松地实施Boss:

class Boss : public IBoss, public ICanShoot
{
};

对某些人来说可能有点过头了,但是如果你的班级heirachy全部搞砸了,这是摆脱困境的最好办法。

看看M $的IUnknown界面。

答案 2 :(得分:1)

有两种不同的方法: 1)Mixin类(已经解释过)
2)角色扮演课程 角色扮演有它的优点和缺点。角色,该对象可以玩(老板,射手,等等)是使用遏制实现的。它们必须从公共基接口类派生,必须动态地下载(argh ..)。调用者会询问您的类的对象是否为角色指针(这是向下转发的位置),如果对象可以扮演角色(返回非NULL指针),则客户端将调用角色的相应函数。 角色扮演方法的主要优点(避免多重继承) - 它是动态的。 Object可以在运行时接受新角色,而不是必须在编译时定义的mixin 它也是可扩展的。在多重继承(mixin)方法中,如果您决定使用“Protector”扩展您的层次结构,并说老板可以很简单BossShootingBossProtectingBoss,{{1以后,ShootingProtectingBoss СowardBossShootingBossProtectingBossShootingProtectingBossCowardBoss进一步扩展它,CowardShootingBossCowardProtectingBoss) - 您看到您的层次结构爆炸了。这是当你需要切换到角色扮演模型时,对象只需要接受新角色CowardShootingProtectingBoss。但直到你确定你需要它 - 坚持使用mixin类。 下面是角色扮演lcases的层次草图:

Coward