2013-02-17 94 views
6

我正在写一个简单的游戏和很多游戏对象共享属性。我有两个潜在的实现。在这种情况下,我应该使用继承还是组合?

第一个如下图中指定使用继承:

Class Hierarchy

加粗类是抽象类,如您所想。分支是实际使用的派生类。需要注意的是,这些类包含有关对象的数据,并没有与它们相关的功能。例如,部队和车辆有一个共同的界面,他们都用来做攻击()和移动()等事情。上面概述的类层次结构只是原始统计信息。而且,它们都是真正的ISA关系。

第二个实现使用组合。而不是上面的类层次结构,每个抽象类都是保存某些数据成员的“模块”。所以SpecialAbility有一个名为PointsValueObject的数据成员(虽然我改变了抽象的名字(尽管它们不再是抽象的),以反映它们的模块化/属性性质)。 Troop有数据成员:PointsValueObject,PhysicalObject,PhysicalAttackObject和BattleOBject,每个模块都包含关于部队的数据。同样,这些模块中不存在功能,它们仅用于存储数据。行为和功能仍然通过接口类来实现。

我的问题是这样的:人们一般喜欢在组成继承,但在这种情况下,我倾向于坚持继承,因为ISA关系保持和层次结构中不包含的行为,唯一的数据。这个层次结构是不是很好的OOD,还是使用属性'modules'更好地构建类?

+1

的“模块”的方法是类似的部件基于[实体系统(http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of -mmog-development-part-1 /)通常用于游戏开发。它牵涉到一些额外的复杂性,但它对于可重用性和可扩展性非常好。我不知道哪种方法会更好,每种方法都有其优点和缺点,但是取决于你的平衡,并决定哪种方法适合你的问题。 – asermax 2013-02-17 19:50:30

回答

4

如果没有代码被重用,您在使用继承时会看到什么优势?继承是DRY(不要重复自己)时的行为是一样的,但没有行为你正在做的是可能限制自己有用 - 如果日后您有需要更少的数据的子层次,有没有一个很好的解决方案为了做到这一点。

+0

对不起,DRY是什么意思? – Slims 2013-02-17 19:56:14

+0

不要重复自己 – KidTempo 2013-02-17 20:00:59

相关问题