6

我正在编写一个简单的游戏,许多游戏对象共享属性。我有两个潜在的实现。

第一种是使用下图中指定的继承:

类层次结构

如您所料,粗体类是抽象类。分支是实际使用的派生类。重要的是要注意这些类包含有关对象的数据,没有与它们关联的功能。

例如,Troop 和 Vehicle 有一个共同的接口,它们都用它来执行诸如 attack() 和 move() 之类的事情。上面概述的类层次结构只是原始统计信息。此外,它们都是真正的 ISA 关系。

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

我的问题是:人们通常更喜欢组合而不是继承,但在这种情况下,我倾向于坚持继承,因为 ISA 关系保持不变,层次结构不包含行为,只包含数据。这个层次结构是好的 OOD 还是使用属性“模块”更好地构建类?

4

1 回答 1

4

如果没有代码被重用,你认为使用继承有什么好处?当行为相同时,继承对于 DRY(不要重复自己)很有用,但如果没有行为,您所做的一切可能会限制自己——如果您后来决定有一个需要较少数据的子层次结构,那么就没有一个好的解决方案这样做。

于 2013-02-17T19:55:23.773 回答