1

現在、私はゲームに取り組んでおり、物事はかなりうまくいっています。現在私を忙しくさせているのは、特定のエリアでモブをスポーンするモブ スポナーを作成することです。

今の大きな問題は、モブの継承が異なるため、スポナーによってスポーンされるすべてのモブを追跡する方法がよくわからないことです。

これは私の MobSpawner クラスです:

public class MobSpawner {

    protected List<Mob> mobs;

    protected Level level;

    protected int timer = 0;
    protected int spawnTime = 0;
    protected int maxMobs = 0;

    public MobSpawner(Level level) {
        this.level = level;
    }

}

これが私の RoachSpawner クラスです。

public class RoachSpawner extends MobSpawner {

    public RoachSpawner(Level level) {
        super(level);
        mobs = new ArrayList<Roach>(); // Roach is an extension of Mob
    }

}

List と ArrayList は同じ型でなければならないため、これは機能しません。

質問は、これを行う方法を他に考えている人はいますか?

前もって感謝します!

4

2 に答える 2

3

私はそれを推測していRoach extends Mobます。

an を使用してesArrayList<Mob>を保持できます。Roachそう:

public RoachSpawner(Level level) {
    super(level);
    mobs = new ArrayList<Mob>();
}

そしてArrayList<Mob>、すべての実装で使用するだけの場合は、代わりにベースに割り当てることができます (ArrayList常に必要なコンテナーであると仮定します。他のListタイプを使用する場合は、kwah の回答を参照し、サブクラスにリストを作成させます):

public class MobSpawner {

    protected final List<Mob> mobs = new ArrayList<Mob>();

    ...

}

そして、サブクラスにベースのリストを使用させるだけです。

基本クラスでリストをインスタンス化して作成するとfinal、次の不変条件を記述できるという副次的効果があります (リフレクションなどでそれらに違反していないと仮定します)。

  • AMobSpawnerは決して null を持たずmobs
  • mobsの存続期間全体で同じオブジェクトを参照しますMobSpawner

これらの仮定を行うことができると、他の場所でロジックの一部を簡素化できる可能性があります。

また、コンパイルfinal時に、誤って別のリストに置き換えないようにすることもできます。

于 2013-08-18T00:38:43.583 に答える
1

まだ行っていない場合は、スーパータイプを利用してみてください。

List変数を であると宣言し、それを であるとインスタンス化できるのと同じ方法で、含む項目を指定してから、文字の特定の実装を入力してArrayListみてください(たとえば、およびでインスタンス化されます)。ListCharacterList<Character>ArrayList<Mob>ArrayList<Roach>

public abstract class Character { }

public class Mob extends Character { }
public class Roach extends Character { }



public class Spawner {
    protected List<? extends Character> characters;
    protected Level level;
    protected int timer = 0;
    protected int spawnTime = 0;
    protected int maxCharacters = 0;

    public Spawner(Level level) {
        this.level = level;
    }

}



public class RoachSpawner extends Spawner {
    public RoachSpawner(Level level) {
        super(level);
        mobs = new ArrayList<Roach>();
    }

}

public class MobSpawner extends Spawner {
    public RoachSpawner(Level level) {
        super(level);
        mobs = new ArrayList<Mob>();
    }

}
于 2013-08-18T00:49:20.897 に答える