我如何让一个方法返回一些不同的对象,然后从所述对象中获取值?

时间:2018-03-19 01:36:43

标签: java class methods

我目前正致力于一个涉及控制各种代理人(在这种情况下是恐龙)的运动的代理项目。每次“转”所有的恐龙都将决定他们需要吃什么“食物”来源以及他们需要移动它们的地方。我已经有了确定下一步的方法 -

public Object wut2Eat(ArrayList<Dinosaur> dinosaurs, ArrayList<Grass> grasses, ArrayList<Water> waters) { //0=dino 1=grass for food type
    if(foodStorage >= waterStorage) {   //i need 2 eets da foodies
        if(isHerbivore()) {                 //i eet grassies
            return closestGrass(grasses);
        } else {                            //i eet dinoes
            return closestDinosaur(dinosaurs);
        }
    } else {                            //i'm a thirsty mofo
        return closestWater(waters);
    }
}

最近的DeltaDinosaur / Grass / Water三种方法看起来完全如下:

public Water closestWater(ArrayList<Water> waters) {
    Water closestWater = null;
    double distance;
    double minDistance = MAX_VALUE;

    for (Water water : waters) {
        distance = calculateDistance(this.getxLoc(), this.getyLoc(), water.getxLoc(), water.getyLoc());
        if(distance < minDistance) {
            closestWater = water;
            minDistance = Double.min(minDistance, distance);
        }
    }
    return closestWater;
}

现在我必须确定当前恐龙的移动方向,并根据它将移动到哪个方向。

public void move(ArrayList<Dinosaur> dinosaurs, ArrayList<Grass> grasses, ArrayList<Water> waters) {
    Object food = wut2Eat(dinosaurs, grasses, waters);

}

三个物体(恐龙,草,水)中的每一个都有一个xLoc和yLoc,用于确定它们在场地上的位置。如何获取这些值以便我可以确定当前恐龙应该移动到哪里?我知道无论wut2Eat返回什么,都将是一个带有xLoc和yLoc变量的对象,其中包含setter和getter。我应该把wut2Eat放在移动中吗?

1 个答案:

答案 0 :(得分:1)

您需要基本类型,或者您需要其他类型可以实现的接口。

interface Positioned {
    int getX();
    int getY();
 }

class Water implements Positioned {
    int getX() { return xLoc; }
    ...
}

也许是Edible implements Positioned界面等

然后,wut2Eat()可以返回Edible而不是Object

这是一个更具体的例子(Java8)

interface Positioned {
    int getX();
    int getY();
    default int distanceTo(Positioned pos) {
        int dx = pos.getX() - getX();
        int dy = pos.getY() - getY();
        return (int) Math.sqrt(dx*dx + dy*dy);
    }
}

interface Edible extends Positioned {
    int getNutritionalValue();
}

interface Agent extends Positioned {
    Edible wat2Eat();

    default Edible closestFood(List<Edible> food) {
       // code to find closest edible food in given list
    }
}

abstract class AbstractFood implements Edible, Positioned {
    int locX, locY;
    int getX() { return locX; }
    // ... etc ...
}

class Water extends AbstractFood {
    // ...
}

class Dinosaur extends AbstractFood, implements Agent {
    Edible wat2Eat() {
        if ( hungry ) {
           if (isHerbivore())
              return closestFood(grasses);
           else
              return closestFood(dinosaurs);
        else
           return closestFood(waters);
    // ...
}

无需重复closestGrass() / closestDinosaur() / closestWater()中的代码。

根据需要进行调整。