我在决定建立这种关系的方法时遇到了麻烦......
所有老板都可以做某些事情并拥有某些东西(速度,健康等),所以这些都是“主要”抽象老板班的一部分。
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?)
基本上,我想知道推荐的建模方法是什么。任何帮助表示赞赏。如果需要更多信息,我很乐意提供。
答案 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
”扩展您的层次结构,并说老板可以很简单Boss
,ShootingBoss
,ProtectingBoss
,{{1以后,ShootingProtectingBoss
Сoward
,Boss
,ShootingBoss
,ProtectingBoss
,ShootingProtectingBoss
,CowardBoss
进一步扩展它,CowardShootingBoss
,CowardProtectingBoss
) - 您看到您的层次结构爆炸了。这是当你需要切换到角色扮演模型时,对象只需要接受新角色CowardShootingProtectingBoss
。但直到你确定你需要它 - 坚持使用mixin类。
下面是角色扮演lcases的层次草图:
Coward