2016-09-19 18 views
3

私の現在のプロジェクトでは、抽象クラスから変数を継承する2つのクラスがあります。類似点の1つは、抽象クラスの拡張子に基づいて、新しいコントローラクラスを作成する必要があることです。これらのクラスにも類似点があり、そのうちの1つは、どのオブジェクトがそれらを構築したかを保存することです。抽象クラスの変数のクラスを変更できます

これらのコントローラクラスの抽象クラスを作成しようとしていますが、それらを作成する抽象クラスの変数を作成しました。ここで問題があるのは、抽象クリエータクラスをコントローラクラスの実装に変更するために、このコントローラクラスの実装が必要なことです。

これは本当に混乱しています。私は例を書いておきます:

これは私の抽象コントローラクラスですから、これを拡張したコントローラクラスの例を書きます。このクラスは、抽象的なGameObjectクラスを拡張するオブジェクトを保存する必要があります。しかし、私はこのクラスを構築した後、 'gameObject'変数にGameObjectの特定の拡張が入っていると確信していますので、その変数だけを使ってこの拡張でできることをしたいと思います。

public class PlayerController extends ObjectController { 
    int speed = 0; 
    public PlayerController(Player player, Game gameVersion{ 
     super(player, gameVersion) 
    } 
    public void updateSpeed(){ 
     speed = player.getSpeed() // example of a method only the Player class has 
    } 
} 

プレーヤ変数をPlayerクラスに常にキャスティングせずに、どうすればよいですか?

public abstract class ObjectController<T extends GameObject> { 

    protected T gameObject; 

    // ... 

    public ObjectController(T object, Game gameVersion) { 
     // ... 
    } 
} 

public class PlayerController extends ObjectController<Player> { 

    // ... 
} 

T extends GameObjectは、あなたのObjectControllerGameObject及び代表者の具体的なタイプは、そのサブクラスに使用する決定を拡張するタイプについて何かを「知っている」ことを意味します

答えて

3

、私はジェネリックを使用することをお勧め:

abstract class ObjectController<T extends GameObject> { 
    protected T gameObject; 
    protected Game gameVersion; 

    public ObjectController(T object, Game gameVersion){ 
     this.gameObject = object; 
     this.gameVersion = gameVersion; 
    } 
    public abstract void nextAction(); 
} 

class PlayerController extends ObjectController<Player> { 

    public PlayerController(Player object, Game gameVersion) { 
     super(object, gameVersion); 
    } 

    @Override 
    public void nextAction() { 
     //Work with your Player here 
    } 

} 

あなたがに合致するようにスーパークラスのT gameObjectを強制しているextends ObjectController、コントローラを作るときあるタイプはinstanceof GameObjectです。このようにして、汎用スーパークラスにTという言葉があれば、あなたが使いたいタイプになります。

編集:あなたがGameObject参照する場合:あなたが好きなら、コンストラクタのObjectController

public class GameObject { 
    private ObjectController<? extends GameObject> controller; 

    //Getter/setter for controller 
} 

あなたもGameObjectcontrollerをインスタンス化することができます "。

ワイルドカード?多かれ少なかれ、このジェネリックは実行時にある種の "instanceof GameObject"になることをコンパイラーに伝えます。ワイルドカードは、コーディング時にクラスの種類を意識している場合には少し難しいかもしれませんが、各コントローラーのジェネリックタイプはのクラスのものなので、object.getController()で簡単にアクセスできます。

+0

ありがとうございました!しかし、コントローラクラスを抽象的なGameObjectクラスに格納すると(GameObjectクラスをControllerクラスに保存しようとしていますが、その逆もあります)、GameObjectの拡張でジェネリックを変更するにはどうすればよいですか?私は今抽象クラスで生の型として保存し、拡張機能でジェネリックを定義しようとするが、それは私にエラーを与える。 – Typhaon

+0

'GameObject'のコントローラーへの参照を保持したいのですが、' GameObject'レベルですか? – Zircon

+0

ええ、ちょっと..私はそれが一番簡単な方法だと思っていましたが、私は提案をすることができます。現時点では、すべてのgameObjectがSetに格納され、各フレームを繰り返し処理し、getController()。nextAction();を呼び出します。 – Typhaon

1

は、ジェネリック医薬品を試してみてください。すべてのあなたのコントローラでこの問題に実行している場合

関連する問題