为了账号安全,请及时绑定邮箱和手机立即绑定

具有不同方法参数的 Java 子类

具有不同方法参数的 Java 子类

一只甜甜圈 2021-07-09 14:00:11
我正在尝试进行模拟简单生物和食肉生物的模拟。我有一个叫做生物的类和一个叫做 carnCreature 的子类。我在生物中有一个名为eat 的方法,它接收一种类型的对象,但我需要carnCreature 类中的eat 方法来接收生物列表。我尝试将方法命名为与生物类中的命名相同,但是当我尝试调用它时,java 不接受更新的参数。package simulationObjects;import java.awt.Color;import java.util.List;import java.util.Random;import java.lang.Math.*;public class Creature {    public int x;    public int y;    public int maxTilesX;    public int maxTilesY;    public Color color;    public float health = 50;    public int life = 0;    public Creature (int x, int y, Color color, int maxTilesX, int maxTilesY) {        this.x = x;        this.y = y;        this.color = color;        this.maxTilesX = maxTilesX;        this.maxTilesY = maxTilesY;    }    public void update(Tile tile) {        eat(tile);        life++;        health-=1;    }    public void eat(Tile currentTile) {        if (currentTile.color == this.color) {            health += 3;            currentTile.color = Color.GRAY;        }      }    public boolean isCarnivore() {        return false;    }}package simulationObjects;import java.awt.Color;import java.util.List;public class CarnCreature extends Creature{    private static final boolean CANABOLIC = false;    public CarnCreature(int x, int y, Color color, int maxTilesX, int maxTilesY) {        super(x, y, color, maxTilesX, maxTilesY);        // TODO Auto-generated constructor stub    }    public void update(List<Creature> creatures) {        eat(creatures);        life++;        health-=1;    }我试图将生物和 carnCreatures 存储在同一个列表中,“生物”。这是问题吗,我是否需要将它们存储在单独的列表中?
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

你有两个选择:

  • 一旦你知道该生物是否是食肉动物,就可以施放它并访问该方法

  • 创建一个具有相同“签名”的方法,即相同的名称和参数。

第二种选择更优雅。使用多态的“魔法”,每个类都会调用它的方法,你不需要用 isCarnivore() 方法检查类。但是您需要从图块中获取生物列表。


查看完整回答
反对 回复 2021-07-14
?
海绵宝宝撒

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()。这意味着在这两种情况下,这两个方法都在子类中定义。

这样的设计不允许从多态特性中受益,因为您想要调用基类实例上的第一个方法并调用子类实例上的重载方法。

从概念上讲,食肉动物不是生物。他们的行为类型非常不同:一个消耗一个东西(一个瓷砖),另一个消耗一个非常不同的东西(一个生物列表)。

为了从多态中受益,您应该重新设计基类和子类以覆盖方法而不是重载它们。但是当你在参数中传递真正不同的类型时,你会被卡住。

所以在你的情况下,我认为我什至不会在这些类之间创建继承关系。


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 200 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信