2012-11-02 93 views
0

我有一個很難找到我需要什麼,並找出如何提出要求,所以請考慮一下:Java類的繼承組織

public class Environment { 
    int x = 0; 
    int y = 0; 
    Operations op = new Operations(); 

    public Environment(){ 
     Operations.changeSuper(); 
    } 
} 

和:

public class Operations extends Environment { 
    public void changeSuper(){ 
     x++; 
     y--; 
    } 
} 

這是我已經嘗試過的一個簡單表示。但是我不認爲初始化環境中的操作是正確的,因爲它會導致構造函數循環。但是,如果我不,那麼當我嘗試調用changeSuper()時,我會得到空指針。

這是使用擴展的正確方法嗎?是否有更好的方法從類文件中提取方法。

長話短說,我想移動的方法列一類的文件,但仍允許他們影響到它的局部變量

+0

你的代碼不會編譯。 'changeSuper'是一個實例方法,當你在'Operations.changeSuper()'中調用它爲* static *。如果您對運行時行爲感興趣,請確保您的代碼在發佈之前先編譯爲問題。 –

+0

我提供的代碼不是字面的,我提供它作爲我所做的簡單解釋。到目前爲止它編譯,但不會運行 – RyanS

+0

上面的代碼不會編譯。 –

回答

2

Environment不是Operations ..所以沒有。 聽起來像你需要組合。而且你應該讓你的班級Operation不是Operations

所以有一些像這樣:

public class Environment { 
    int x = 0; 
    int y = 0; 
    Operation op ; 

    public Environment(){ 
     op=new Operation(this); 

    } 

    public void changeEnvironment() {} 
    public void incrementX(){} 
    public void incrementY() {} 
} 

和:

public class Operation { 
    Environment e; 
    public Operation(Environment e){ 
     this.e = e; 
     e.incrementX(); 
     e.decrementY(); 
    } 
    public void changeEnvironment() 
    { 
     e.changeEnvironment() ; 
    } 
} 

如果變化是Environment只有這樣做,那麼它使維護更容易,也保留封裝。

+0

我以前沒考慮過。 'e'不只是'this'傳遞的實際類的副本嗎?這意味着,當changeSuper方法完成後,這些值將會丟失,環境將保持不變? – RyanS

+0

它是參考文獻的副本。所以內存中的實際環境對象被修改。對不起,我一半清醒..我只是有這種感覺我給你一個不好的建議:( –

+0

不用擔心,我感覺一樣,因此我的問題。謝謝,我會嘗試一下 – RyanS

0

我相信changeSuper應該是靜態的。

+1

錯!如果是靜態的,changeSuper將無法訪問環境屬性! – falsarella

+0

對不起,你說得對,我想我已經匆忙下結論了。 –

1

您不能通過繼承引用超類中的子類Operations。相反,要Environment爲抽象類定義changeSuper如下抽象方法:

public abstract class Environment { 
    int x = 0; 
    int y = 0; 
    public abstract void changeSuper(); 

    public Environment(){ 
    changeSuper(); 
    } 
    } 

然後定義Operations類來擴展Environment並實現如下changeSuper()方法:

public class Operations extends Environment { 
    @Override 
    public void changeSuper(){ 
      x++; 
      y--; 
    } 
    } 

現在,如果你創建一個main方法Operations類別:

public static void main(String[] args) { 
    Environment env = new Operations(); 
    System.out.println("x="+env.x+"&y="+env.y);//<- it will print x=-1&y=-1 
} 
+0

我試圖避免必須重寫所有的方法,其目的是從主類中刪除70個ish方法 – RyanS

+0

@RyanS:它在超類和實現中的只是聲明只在子類中,沒有重複實現。 –

0

,我不認爲你想操作既

  • 環境的亞型和

  • 環境的實例變量

如果環境是運營超 - 它們會自動共享非私有實例變量(不需要另一個調用另一個)。 如果不是超類型,則通過直接訪問實例變量來破壞封裝是不好的做法。

試試這個:

public class Environment { 
    int x = 0; 
    int y = 0; 

    public Environment(){ 
    } 
} 

and: 

public class Operations extends Environment { 
    public void changeState(){ 
     x++; 
     y--; 
    } 
} 

and: 

public class MasterControl { 
    Operations op = new Operations(); 
    op.changeState(); 
} 

或者

public class Environment { 
    int x = 0; 
    int y = 0; 
    Operations op = new Operations(); 

    public Environment(){ 
     op.changeState(); 
    } 

    public int getX() {return x;} 
    public setX(int x) {this.x = x;} 
    public int getY() {return y;} 
    public setY(int x) {this.y = y;} 

} 

和:

public class Operations { 
    public void changeState(Environment env){ 
     env.setX(env.getX+1); 
     env.setY(env.getY-1); 
    } 
} 

這裏環境已存儲環境狀態,使責任之AV可以用於其他物體。這裏的操作正在執行專家操作來修改環境狀態。

凱?