class Entity {
// various fields and methods
}
class MobileEntity extends Entity {
// various fields and methods
}
interface Consumer {
public void consume(final Consumable c);
}
interface Consumable {
public void onConsume(final Consumer c);
}
class Player extends MobileEntity implements Consumer {
// Override methods, etc
// Can consume
}
class Npc extends MobileEntity {
// Cannot consume anything
}
class Food implements Consumable {
public void onConsume(final Consumer c) {
if (c instanceof Player) {
healPlayer();
removeFood(1);
}
}
}
很抱歉将所有代码放在首位,但我认为这对我来说更容易解释,并且如果你看到它也能让你理解。这是我正在开发的游戏。我遇到的问题是如何在不使用instanceof运算符的情况下处理消耗品(无论是食物还是饮料)。我想避免在 Food 类中设置具体类Player(因为最终可能会有数百种不同类型的 Food),但在每种情况下都有合同例外(这表明存在问题)。
并非所有实体实现都会有健康字段。他们可能会,但如果是这样,我需要将某些标记为“可攻击”,然后进行测试
void applyDamage(int damage) {
if (attackable) {
health -= damage;
}
}
由于硬编码行为(引入新类的指标),这引入了新问题
我听说可能在类似的线程中使用访问者模式,但我认为它不适用于当前情况。