2 回答
TA贡献1810条经验 获得超4个赞
你有两个选择:
一旦你知道该生物是否是食肉动物,就可以施放它并访问该方法
创建一个具有相同“签名”的方法,即相同的名称和参数。
第二种选择更优雅。使用多态的“魔法”,每个类都会调用它的方法,你不需要用 isCarnivore() 方法检查类。但是您需要从图块中获取生物列表。
TA贡献1809条经验 获得超8个赞
isCarnivore()当您操作Creature基类的声明类型时,该测试不会让您强制转换为子类类型:
for (Creature creature : creatures) {
if (creature.isCarnivore()) {
((CarnCreature)creature).update(creatures);
} else {
creature.update(tiles.get(creature.x).get(creature.y));
}
}
所以isCarnivore()看起来无助的if (instanceof CarnCreature)会产生同样的效果和后果。
这是问题吗,我是否需要将它们存储在单独的列表中?
这会更好,因为您不想以统一的方式操纵它们。
使用基类将它们分组在一个唯一的 List 中会使您的任务更加困难。
但实际上你有一个更深层次的问题。这里eat()不是重载方法,而是子类中的重载方法。同样的事情update()。这意味着在这两种情况下,这两个方法都在子类中定义。
这样的设计不允许从多态特性中受益,因为您想要调用基类实例上的第一个方法并调用子类实例上的重载方法。
从概念上讲,食肉动物不是生物。他们的行为类型非常不同:一个消耗一个东西(一个瓷砖),另一个消耗一个非常不同的东西(一个生物列表)。
为了从多态中受益,您应该重新设计基类和子类以覆盖方法而不是重载它们。但是当你在参数中传递真正不同的类型时,你会被卡住。
所以在你的情况下,我认为我什至不会在这些类之间创建继承关系。
添加回答
举报