私は現在、グリッドベースのパズルゲームを書いている、と問題に遭遇してきました。
私は、各スプライトは私のマップ(プレイヤー、壁など)にいくつかのオブジェクトを表す抽象Spriteクラスを持っています。このSpriteクラスは、子供(項目、エンティティ、障害物)を有しており、これらの子供たちは、子供たち(項目がInventoryItemとInstantUseItemを持っている)、などがあります。任意の更なる子を持たない唯一の子供たちは抽象的ではない、あなただけのインスタンス化のコンクリートは、あなたが(あなたが武器剣と矢をインスタンス化することはできませんが、 - 彼らの親オブジェクト)にゲーム見つけることができるオブジェクトをできるようにします。
私の問題は、スプライトのArrayListに(各マップは、幅*高さのタイルを持っている)私はタイル上のすべてのオブジェクトを格納してるということです、そして今私はPlayerオブジェクトが上にあるタイルのfindのような何かをしたい、またはことをすべてのタイルを見つけます敵オブジェクト(またはそれらから継承するクラス)が含まれています。
問題は、私の知る限りとして、私は私の地図やタイルオブジェクトにこれに似た何かを行うことができない、ということです。
public ArrayList<t> findAllSpritesOfType(Type t) {
ArrayList<t> sprites = new ArrayList<t>();
for(Sprite s : this.getSprites()) {
if(s instanceof t) {
sprites.add((t) s); //Add after casting to right class
}
}
return sprites;
}
私はスプライトの静的機能を実装しようとしても、私はこの(Spriteの子供たちのすべての中で「自動共分散」のようなもの)が必要になります。
public static ArrayList<this.Type> getSpritesOnTile(Tile t) {
ArrayList<this.Type> sprites = new ArrayList<this.Type>();
for(Sprite s : t.getSprites()) {
if(s instanceof this.Type) {
sprites.add((this.Type) s); //Add after casting to right class
}
}
return sprites;
}
私が関与すると考えている他の方法:
- 後者の方法は、その後、共分散を使用して、子の配列を返すために、すべての子どもたちに、このメソッドをオーバーライド、スプライトの配列を返し作ります。
- スプライトを作ることは、適切な子供たちにこれらのメソッドをオーバーライドします(これはすべての戻り偽)など、isWeapon()、isItem()、isEntityを()が含まれています。私は今、これらの方法の代わりに、統一isGivenType(タイプT)法、またはUnified静的Type.isGivenType()メソッドを使用します。
、オブジェクト指向の原則に必ず私のプログラムの準拠を作成し、簡単に拡張残っているのは、このプロジェクトに非常に重要です。私の解決策のいずれかを実装する、または私の目標を達成する方法はありますか?
これはあなたが望むものであるように見えます:
public <T extends Sprite> ArrayList<T> findAllSpritesOfType(Class<T> clazz) {
ArrayList<T> sprites = new ArrayList<>();
for(Sprite s : this.getSprites()) {
if(clazz.isInstance(s)) {
sprites.add((T) s);
}
}
return sprites;
}
そして、あなたはこのようにそれを使用することができます:
List<Item> items = findAllSpritesOfType(Item.class);
それを行うための別の方法ではなく、リストのストリームを返すために、次のようになります。
public <T extends Sprite> Stream<T> findAllSpritesOfType(Class<T> clazz) {
return getSprites().stream().filter(clazz::isInstance).map(clazz::cast);
}