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

Sli*_*ims 6 java oop inheritance composition

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

第一种是使用继承,如下图所示:

类层次结构

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

例如,部队和车辆有一个共同的界面,他们都用它来做诸如attack()和move()之类的事情.上面列出的类层次结构只是原始统计数据.此外,它们都是真正的ISA关系.

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

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

jmo*_*eno 4

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