【问题标题】:Matrix of objects from different classes in javajava中不同类的对象矩阵
【发布时间】:2015-06-25 21:06:29
【问题描述】:

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

所以,在Farm 对象中,我想要一个包含房屋对象、池塘对象、花园对象和田地对象(所有不同类)的子位置矩阵/数组。我想做以下事情:

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 类扩展/继承/或某些东西?还是有其他方法可以将所有这些对象推入矩阵?

【问题讨论】:

    标签: java arrays object matrix


    【解决方案1】:

    使用继承 -

    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】:

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

      【讨论】:

        【解决方案3】:

        我猜你想要做的是编写一个interface

        我想参考 StackOverFlow 中我最喜欢的答案之一,它解释了what does it mean to program an Interface。其中使用的示例可能是我读过的最好的示例之一。

        在你的例子中,像 Pond、Field、Garden 等所有类都将实现接口 SubPlace。

        【讨论】:

          【解决方案4】:

          有两种通用方法。您可以使用InterfacesAbstract Classes。两者都旨在为程序的其余部分提供一些合同(主要以方法的形式)。您的每个SubPlaces 都可能具有某些属性,例如要显示的 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-构造函数。用户有两种选择,并且可以选择使用哪一种。

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

          【讨论】:

            【解决方案5】:

            是的,你必须有一个接口 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();
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-12-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-13
              • 1970-01-01
              • 2017-02-03
              • 1970-01-01
              相关资源
              最近更新 更多