我正在用 Java 進行模擬,但是在擴展時我很難操作變數。
為了使問題更容易表達,讓我們考慮 2 個 Java 類 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。所以我創建了兩個類 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 上運行我的 main 然后 draw_list 我得到了 Grid1 而不是 Grid2 的圖片......那么我該如何解決這個問題?換句話說,我想擴展一個類并更改新擴展類中變數的型別。
謝謝
PS:實際上模擬是關于康威生命游戲和移民自動機。我想擴大移民像康威一樣......
uj5u.com熱心網友回復:
所有的狗都是動物,對吧?好吧,所有 Grid2 實體也是 Grid1。出于同樣的原因:Grid2 extends Grid1意味著:Grid2 是 Grid1 定義的一切,等等。
因此,如果你擴展Sim1你不希望添加的第二場,因為現在你的SIM2有2場。相反,您希望最終將 Grid2 的實體分配給 Grid1 型別的欄位。最終運行Grid1 g = new Grid2();完全合法的java代碼,出于同樣的原因Animal a = new Dog();就可以了。
正如所寫,你的Grid1班級已經死在水中。您必須呼叫父類的建構式之一,并且您的 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 實體的地方呼叫那個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/342778.html
上一篇:使用數學方法重寫數學函式
下一篇:Java正則運算式非空字串
