Java:如何检查实例所属的对象?

时间:2014-07-10 16:06:03

标签: java arrays object instance equals

如果这个问题已经得到回答,请道歉,虽然我确实有广泛的看法,但无法找到答案。总结一下情况我试图创建一个模拟器程序,处理不同的捕食者和猎物生物,目前有让每个生物检查它旁边的生物类型的问题,我更愿意检查是否instance属于同一个对象。

所以说例如我做了这个:

private class Creature {
...
Creature [] fish = new Creature();
Creature [] shark = new Creature();
Creature [] penguin = new Creature();
}

然后在循环中创建每种类型的几个实例(生物),如下所示:

for (int f=1;f<rnd;f++) {
fish[f] = new Creature();
//set attributes of creature

然后所以程序可以告诉他们彼此之间的位置我创建了一个像这样的网格系统:

Creature [][] gridloc = new Creature[x][y]; //relates to number of spaces tiles that determines movement.
Creature [] crloc = new Creature[tc]; //stores a reference to all creatures created.
...

crloc[tc] = fish[f]; gridloc[x][y]=crloc[tc] //or fish[f]
}

无论如何总结甚至我在那里总结了相当多的代码,这一切都有效但是当让每个生物在gridloc中检查它旁边时,例如一个捕食者我不确定一种方法来检查它是否找到另一个生物来确定它是同一物体类型的实例还是不同的实体。如下所示:

if (!gridloc[x][y].getObject().equals(gridloc[x+1][y].getObject()) //if the current creature is not the same as the one next to it.

我知道像instanceof这样的东西,但它只适用于检查一个对象是否是一个类的实例,而不是一个实例属于同一类型的对象。我也不能简单地使用fish [1] .equals(fish [2]),因为它们具有不同的属性,并且会检查它们是否完全相同。

欢迎任何想法/建议。谢谢!

4 个答案:

答案 0 :(得分:5)

你需要研究多态性(http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html)。您将Creature声明为基类(或接口),并为您拥有的每种类型的生物从Creature类扩展/实现。每个子类都将实现它自己的方法来覆盖Creature,并允许您正确使用这些方法,并使用每个实例将具有的类元数据来检测类型。

答案 1 :(得分:2)

这是您的设计问题。你必须创建一个名为Creature的超类和鱼类,企鹅和其他所有的子类。然后使用这些子类类型创建数组。然后,您可以使用网格的相邻对象执行检查实例。

此设计基于多态性。 从长远来看,这是最好的方法,因为代码更干净,更有条理。如果你这样做,即使几年后你看一下代码;它仍然有意义。

答案 2 :(得分:2)

一个选项(从长远来看,也许是最好的,见@AlexC和@Don的答案)将是制作生物的子类,称为Fish,Shark,Penguin等。然后你可以使用instanceof

要将其与多态性结合起来,你需要添加一个方法public boolean eats(Creature other)另外,当我帮助照看一个4岁的孩子时,他最喜欢的小塑料动物形象的游戏是“什么吃什么”的大声尖叫喜悦。

  1. 在Creature中,代码为return false;(虽然可以说鱼吃鱼?)
  2. 在Penguin中,代码为return other instanceof Fish;
  3. 在Shark中,代码为return true;
  4. 另一种选择是拥有描述它的Creature字段。也许是enum,或拉丁语分类名称的字符串。然后,您可以使用genus.equals("Carcharodon")表示Shark或latinName.contains("Spheniscidae")表示Penguin。

答案 3 :(得分:1)

也许生物应该是一个枚举...

public enum Creature {
    FISH(false), SHARK(true), PENGUIN(true);
    private boolean isPredator;
    private Point gridLocation;

    Creature(boolean isPredator) {
        this.isPredator = isPredator;
    }
    // ...getters/setters
}   

为网格位置设置单独的世界级...

public class World {
    List<Creature> creatures = new LinkedList<>();

    public boolean isNearPredator(Creature c) {
        for (Creature i : creatures) {
            if (i.getGridLocation().distance(c.getGridLocation()) < 2
                    && i.isPredator()) {
                System.out.println("About to get eaten!");
            }
        }
    }
}