我正在创造一个开放的世界游戏,每个“地方”由“子地点”组成
例如,我有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类的东西?或者是否有其他方法可以在矩阵中推送所有这些对象?
答案 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)
有两种一般方法。您可以使用Interfaces或Abstract Classes。两者都旨在为该计划的其余部分提供一些合同(主要是方法形式)。您的每个SubPlace
都可能具有某些属性,例如。要显示Image
,因此您可能需要定义public Image getImage()
方法。
什么时候使用?说到性能,抽象类是slightly faster than interfaces,但这不会影响您的决定。如果您使用的部件属于同一类,则可能需要使用抽象类。例如,Ford
和Porsche
都是CarManifacturer
。但是,如果部件根本不同,则可能需要使用界面。 Printable
就是一个很好的例子:Page
可以打印,Image
或RCHelicopter
(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();
}
}