1

我正在将游戏编程为 Java 小程序,并且我有两个具有相似变量的不同类 -PavementWay.

我想创建一个包含两个类的对象的数组。例如x,我必须更改y所有这些对象,所以我想创建一个Array. 这可能吗?

我已经尝试过ArrayList<Object> obj = new ArrayList<Object>();,但如果我obj.add(0, theWay);找不到读取变量的方法。

我也试过System.out.print(obj.get(0));rpg.way@2c61bbb7

4

3 回答 3

7

简而言之,您想setX()在 Way 实例或 Pavement 实例上调用方法(如 ),而不知道对象是 Way 还是 Pavement。

这正是多态性解决的问题。定义一个接口Locatable,让你的两个类实现这个接口。然后创建一个List<Locatable>,您就可以在其中添加 Ways 和 Pavements:

public interface Locatable {
    public void setX(int x);
    public void setY(int y);

    public int getX();
    public int getY();
}

public class Way implements Locatable {
    ...
}

public class Pavement implements Locatable {
    ...
}

List<Locatable> locatables = new ArrayList<Locatable>();
list.add(new Way());
list.add(new Pavement());
for (Locatable locatable: locatables) {
    locatable.setX(22);
    locatable.setY(43);
}

for (Locatable locatable: locatables) {
    System.out.println("the locatable is an instance of " + locatable.getClass());
    System.out.println("its location is " + locatable.getX() + ", " + locatable.getY());

}
于 2013-08-16T13:50:53.953 回答
1

您可以使用ArrayList<Object>并检查对象的类型。

例如:

ArrayList<Object> L = new ArrayList<Object>();
//..add objects
for (Object o : L){
    if(o.getClass() == Class1.class){
        Class1 obj1 = (Class1) o;
        //...
    }else if(o.getClass() == Class2.class){
        Class2 obj2 = (Class2) o;
        //...
    }else{
        //...
    }
}

您也可以使用instanceof来检查类型。

于 2013-08-16T13:12:26.977 回答
0

您提到课程不同但相似?如果类足够相似以至于您想尝试在类上调用相同的方法,您可能需要考虑使用抽象类来概括类:这比“实例”和种姓解决方案要好得多。您也可以使用接口,但如果它们以相同的方式工作,抽象类允许您实际实现 changeX() 和 changeY()。例如,如果您想对其中任何一个对象调用 changeX(int x) 或 changeY(int y) ,无论它们是对象Way还是Pavement对象,您可能需要执行以下操作:

public abstract class Changeable
{
    public void changeX(int x) {
        this.x = x;
    }
    public void changeY(int y) {
        this.y = y;
    }

    protected int x;
    protected int y;
}

public Class Pavement extends Changeable{ ... }

public Class Way extends Changeable{ ... }

此时您可以创建一个接口数组并在其中插入对象,如下所示:

List<Changeable> paths = new ArrayList<Changeable>();
paths.add(new Way());
paths.add(new Pavement());
Changeable path = paths.get(0);
path.changeX(5);
path.changeY(7);
于 2013-08-16T14:00:19.437 回答