更改变量时在 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实例的地方。
我正在 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实例的地方。