我将游戏编程为Java applet,我有两个不同的类,它们具有相似的变量 - Pavement
和Way
。
我想创建一个包含两个类对象的Array。我必须更改所有这些对象的x
和y
,因此我想创建一个Array
。这可能吗?
我已尝试ArrayList<Object> obj = new ArrayList<Object>();
,但如果我obj.add(0, theWay);
我无法找到读取变量的方法。
我还尝试System.out.print(obj.get(0));
并获得了rpg.way@2c61bbb7
。
答案 0 :(得分:6)
简而言之,您希望在Way实例或Pavement实例上调用方法(如setX()
),而不知道对象是方式还是路面。
这正是多态性解决的问题。定义接口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());
}
答案 1 :(得分: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
来检查类型。
答案 2 :(得分: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);