java中不同类的对象矩阵

时间:2015-06-25 21:06:29

标签: java arrays object matrix

我正在创造一个开放的世界游戏,每个“地方”由“子地点”组成 例如,我有Farm.java class图形表示的子地点矩阵:房子,池塘,花园和田地,用户可以“移动”通过这个矩阵并与不同的矩阵互动地方。

所以,在一个Farm对象中,我想要一个子位置矩阵/数组,它包含一个house对象,一个池对象,一个garden对象和一个field对象(所有不同的类)。我想做以下事情:

SubPlace[][] map = new SubPlace[1][1]

但是我不能这样做,因为没有实际的SubPlace.java类,我不知道如何将这些不同的对象推入同一个矩阵。

我希望矩阵看起来像这样:

map[0][0]= new House();
map[0][1]= new Pond();
map[1][0]= new Field();
map[1][1]= new Garden();

如果这些都是不同的类,我怎么能这样做?他们是否需要扩展/继承/或来自公共SubPlace类的东西?或者是否有其他方法可以在矩阵中推送所有这些对象?

5 个答案:

答案 0 :(得分:2)

所有java对象最终都会扩展java.lang.Object,因此在最坏的情况下,您始终可以使用Object[][]。但这是不优雅的。像你提出的那样,最好的方法是提取像SubPlace这样的基类(或接口),它将包含你需要执行所有地图对象的常用方法(例如draw())。

答案 1 :(得分:2)

使用继承 -

class Place {}
class Farm extends Place {}
class Pond extends Place {}
class House extends Place{} etc...

Place[][] map = new Place[1][1];
map[0][0] = new Farm();

答案 2 :(得分:1)

我想你想做的就是编程interface

我想在StackOverFlow中引用我最喜欢的一个解释what does it mean to program an Interface的答案。在那里使用的例子可能是我读过的最好的一个。

在你的情况下,像Pond,Field,Garden这样的所有类都会实现一个接口子区域。

答案 3 :(得分:1)

有两种一般方法。您可以使用InterfacesAbstract Classes。两者都旨在为该计划的其余部分提供一些合同(主要是方法形式)。您的每个SubPlace都可能具有某些属性,例如。要显示Image,因此您可能需要定义public Image getImage()方法。

什么时候使用?说到性能,抽象类是slightly faster than interfaces,但这不会影响您的决定。如果您使用的部件属于同一类,则可能需要使用抽象类。例如,FordPorsche都是CarManifacturer。但是,如果部件根本不同,则可能需要使用界面。 Printable就是一个很好的例子:Page可以打印,ImageRCHelicopter(3D打印机...)。

另外请注意,如果已经使用了继承,则可能需要使用接口(因为Java不允许多继承)。

有些情况下,您实际上可以同时使用它们。 Thread就是一个很好的例子:要让Thread工作,您可以让您的班级extends Thread然后start()成为此班级的一个实例。启动线程的另一种常见可能性(特别是Java 8和lambdas的出现)是将Runnable作为参数传递给Thread - 构造函数。用户有两个选项,可以选择使用哪个。

在你的情况下,我认为一个抽象类应该完成这项工作。

答案 4 :(得分:0)

是的,你必须有一个接口SubPlace并实现你想要的任何地方。我提供了一个模拟

interface SubPlace {

}

class House implements SubPlace {

}

class Pond implements SubPlace {

}

class Field implements SubPlace {

}

class Garden implements SubPlace {

}

public class GUI {

    public static void main(String[] args) {
        SubPlace[][] map = new SubPlace[1][1];
        map[0][0] = new House();
        map[0][1] = new Pond();
        map[1][0] = new Field();
        map[1][1] = new Garden();
    }
}