0

動的に使用するように設計された一般的な関数を処理するための「拡張」クラスがあります。つまり、さまざまなクラスや変数で使用できるようにしたいのです (Math クラスのようなものを使用する方法のようなものです)。しかし、私には理解できない小さな問題が発生しました (かなりの数のフォーラムや Web サイトを見てきましたが、うまくいきませんでした)。

私の Extension クラスの関数は次のとおりです。

public void setPlayerFriction(Object objectType, double hspeed, double vspeed){
    objectType obj = new objectType();

    if(obj.hspeed >= GameWindow.friction){
          obj.hspeed -= GameWindow.friction;
    }else if(obj.hspeed <= -GameWindow.friction){
          obj.hspeed += GameWindow.friction;
    }else{
          obj.hspeed = 0;
    }
    if(obj.vspeed >= GameWindow.friction){
          obj.vspeed -= GameWindow.friction;
    }else if(obj.vspeed <= -GameWindow.friction){
          obj.vspeed += GameWindow.friction;
    }else{
          obj.vspeed = 0;
    }
}

そして、私の Player クラスでの関数の使用:

public void runPhysicsEngine(){
    Extensions ext = new Extensions();
    ext.setPlayerFriction(this,hspeed,vspeed);
}

明らかに、メソッドの引数obj.var -= GameWindow.friction;where objand varare のようなことを行うことは、私がやりたいことを行う正しい方法ではありません-未解決の型エラーを返すだけです。では、正しい方法は何ですか?動的クラス名から変数にアクセスするにはどうすればよいですか?

4

1 に答える 1

0

適切なメソッドを備えたabstractクラスが役立つと思います。例えば:objectTypegetter/setter

public abstract class ParentObject {

    private double hSpeed;
    private double vSpeed;

    /** Getter/setter methods */

    public double gethSpeed() {
        return hSpeed;
    }
    public void sethSpeed(double hSpeed) {
        this.hSpeed = hSpeed;
    }
    public double getvSpeed() {
        return vSpeed;
    }
    public void setvSpeed(double vSpeed) {
        this.vSpeed = vSpeed;
    }
}

その後、このクラスObjectTypeであるクラスを具体的に実装できます。そして、次のようにメソッドを変更します。extendParentObjectsetPlayerFriction()

public void setPlayerFriction(ParentObject objectType, double hspeed, double vspeed){

    double hSpeed = objectType.gethSpeed();
    if(hSpeed >= GameWindow.friction){
          objectType.sethSpeed(hSpeed - GameWindow.friction);
    }else if(hSpeed <= -GameWindow.friction){
          objectType.sethSpeed(hSpeed + GameWindow.friction);
    }else{
          objectType.sethSpeed(0);
    }

    double vSpeed = getvSpeed();
    if(vSpeed >= GameWindow.friction){
          objectType.setvSpeed(vSpeed - GameWindow.friction);
    }else if(obj.vspeed <= -GameWindow.friction){
          objectType.setvSpeed(vSpeed + GameWindow.friction);
    }else{
          objectType.setvSpeed(0);
    }
}

このメソッドには、基本的に、実際にクラスを拡張したクラスの参照を送信しますParentObject。例えば:

public class ObjImpl extends ParentObject{
    //Concrete implementation
}

public class ObjImpl2 extends ParentObject{
    //Concrete implementation
}

public class TestClass{
    public void setPlayerFriction(ParentObject objectType, double hspeed, double vspeed){   
        double hSpeed = objectType.gethSpeed();
        if(hSpeed >= GameWindow.friction){
              objectType.sethSpeed(hSpeed - GameWindow.friction);
        }else if(hSpeed <= -GameWindow.friction){
              objectType.sethSpeed(hSpeed + GameWindow.friction);
        }else{
              objectType.sethSpeed(0);
        }

        double vSpeed = getvSpeed();
        if(vSpeed >= GameWindow.friction){
              objectType.setvSpeed(vSpeed - GameWindow.friction);
        }else if(obj.vspeed <= -GameWindow.friction){
              objectType.setvSpeed(vSpeed + GameWindow.friction);
        }else{
              objectType.setvSpeed(0);
        }
    }

    public static void main(String[] args) {
        ParentObject object1    = new ObjImpl();
        ParentObject object2    = new ObjImpl2();

        setPlayerFriction(object1, 1.0d, 2.0d);
        setPlayerFriction(object2, 2.25d, 2.0d);
    }
}
于 2012-08-26T07:33:24.060 に答える