更改变量时在 java 中扩展的正确方法

Proper way to extend in java while changing variables

我正在 java 中进行模拟,但我在扩展时很难操纵变量。

为了使问题更容易表达让我们考虑 2 Java classes Grid1 和 Grid2。

网格 1

Class Grid1 {
    public int a;
    public int grid[];

    public Grid1(int a) {
       this.a=a;
       grid = new int[50];
    }
    
    public update() {
       for (int i : grid) {
           i+=a;
       }
    }
}

网格 2

Class Grid2 extend Grid1 {

    public Grid2(int a) {
       super(a)
    }
    
    @Override
    public update() {
       for (int i : grid) {
           i+=2*a;
       }
    }
}

现在假设我想在模拟中使用 Grid1 和 Grid2。所以我创建了两个 classes Sim1 和 Sim2。

模拟 1

Class Sim1 {
    public Grid1 grid1;

    public Sim1() {
       grid1 = new Grid1(10);
    }
    
    public draw() {
       draw_list(grid1); //lets say draw list is defined elsewhere
    }
}

模拟2

Class Sim2 extend Sim1{
    public Grid2 grid2;

    public Sim2() {
       grid2 = new Grid2(10);
    }
}

现在当我 运行 update() 在我的 Sim2 主界面然后 draw_list 我得到 Grid1 而不是 Grid2 的图片... 那么我该如何解决呢? 换句话说,我想扩展 class 并更改新扩展 class.

中的变量类型

谢谢

PS: 其实模拟的是康威人生博弈和移民自动机。我想像康威一样扩大移民...

所有的狗都是动物,对吧?那么,所有 Grid2 实例也是 Grid1。出于同样的原因:Grid2 extends Grid1 表示:Grid2 是 Grid1 定义的所有内容,和更多

因此,如果您扩展 Sim1,您 不会 想要添加第二个字段,因为现在您的 Sim2 有 2 个字段。相反,您希望最终将 Grid2 的实例分配给类型为 Grid1 的字段。结束 运行 Grid1 g = new Grid2(); 这是完全合法的 java 代码,出于同样的原因 Animal a = new Dog(); 就可以了。

正如所写,您的 Grid1 class 已经死在水里了。您必须调用您的父 class 之一的构造函数,并且您的 Sim1 构造函数创建一个新的 Grid1 实例。当 Grid2 的构造函数运行时,您不希望这样。我们也需要解决这个问题。你还把public弄得一团糟,这不是很好。

class Sim1 {
  private Grid1 grid;

  public Sim1() {
    this(new Grid1(10));
  }

  protected Sim1(Grid1 grid) {
    this.grid = grid;
  }
  
  public draw() {
     draw_list(grid); //lets say draw list is defined elsewhere
  }
}
Class Sim2 extend Sim1 {
  public Sim2() {
    super(new Grid2(10));
  }
}

我们现在有 2 个构造函数; Sim2可以选择调用哪一个,显然我们调用的是我们提供现成的Grid实例的地方。