【发布时间】:2015-01-03 03:14:22
【问题描述】:
我正在构建一个迷宫游戏,玩家必须在迷宫中导航,敌人在追他。
我想知道用“Zombie”和“Vampire”子类实现 Enemy 类的最佳方法是什么。目前这两个类别实际上是相同的,除了它们的颜色。运动策略是相同的,但是这可能会在未来发生变化。此外,我希望允许可扩展性,即如果客户想要添加更多具有不同移动策略的敌人,而不是在不更改现有代码库的情况下这样做。
我正在寻找不同的方法来做到这一点:
只需使用一个 Enemy 类,该类在其构造函数中接收一个字符串,并根据传入的是“Zombie”还是“Vampire”来决定制作“Enemy”的颜色。但是这不允许不同移动策略,如果添加许多其他敌人,就会有条件分支的建立。
具有抽象方法
move()和getColor()的Abstract Enemy 类,这允许每个类定义自己的移动策略并持有对其颜色的引用。但是,如果敌人可能只是颜色不同,这不是有点矫枉过正。在我的实现中,敌人的移动都是一样的,但展示可扩展性的潜力总是一个加分项。
【问题讨论】:
-
我肯定会选择第二个选项!使用一个抽象的 Enemy 类,实现了常用方法并声明为抽象的不常用方法。僵尸和吸血鬼扩展了 Enemy,因此它们必须实现其抽象方法。
-
唯一的问题是,现在,我的 Zombie 和 Vampire move() 实现将是相同的。这是糟糕的设计实践吗?
-
是的,最好只写一次相同的代码。如果您忘记只更新一种方法会发生什么?在 Enemy 类上实现这一点,如果您以后需要在另一个类中更改它,您可以覆盖它。
-
如果是这种情况,那么您可以只在抽象类中定义 'defaukt' move() 方法,而不是在 Zombie 和 Vampire 子类中覆盖它。
-
@Dg123 如果你想稍微复杂一点,你总是可以建立一个运动“策略”,然后用它来构建你的敌人。这使您可以动态地改变运动(例如,如果敌人饿了或阳光来了)。
标签: java inheritance abstract-class subclass superclass