0

必要なものを見つけるのに苦労しており、それを求める方法を考え出すのに苦労しているので、次のことを考慮してください:

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() を呼び出そうとすると null ポインターが返されます。

これは extends を使用する正しい方法ですか? クラスファイルからメソッドを抽象化するより良い方法があるでしょうか。

簡単に言えば、クラスファイルからメソッドを移動したいのですが、それでもローカル変数に影響を与えることができます

4

4 に答える 4

2

EnvironmentではないOperations..いいえ。合成が必要なようです。Operationそして、クラスを notにする必要があります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と、メンテナンスが容易になり、カプセル化も保持されます。

于 2012-11-02T00:25:02.520 に答える
1

継承によってOperationsスーパー クラスのサブクラスを参照することはできません。代わりに、抽象クラスとして作成し、以下のように抽象メソッドとして定義します。EnvironmentchangeSuper

 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
}
于 2012-11-02T00:30:37.733 に答える
0

changeSuper は静的であるべきだと思います。

于 2012-11-02T00:19:10.313 に答える
0

オペレーションを両方にしたくないと思います

  • 環境のサブタイプと

  • Environment のインスタンス変数

Environment が Operations のスーパータイプである場合、それらは非プライベート インスタンス変数を自動的に共有します (一方が他方を呼び出す必要はありません)。スーパータイプでない場合、インスタンス変数に直接アクセスしてカプセル化を解除するのは悪い習慣です。

これを試して:

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);
    }
}

ここで Environment は、環境の状態を保存し、それを他のオブジェクトで利用できるようにする責任があります。ここでオペレーションは、環境の状態を変更するための専門的なオペレーションを実行しています。

ケイ?

于 2012-11-02T03:13:43.290 に答える