在这种情况下,我应该使用继承还是组合?

时间:2013-02-17 19:41:02

标签: java oop inheritance composition

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

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

Class Hierarchy

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

例如,Troop和Vehicle有一个共同的界面,他们都用它来做像attack()和move()这样的事情。上面列出的类层次结构只是原始统计数据。此外,它们都是真正的ISA关系。

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

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

1 个答案:

答案 0 :(得分:4)

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