0

forループを介して敵の「波」を達成しようとしています。基本的に、waveオブジェクトが呼び出されると、wave内の敵の数を設定するintを受け入れます。各敵には、「敵」のサブクラスである独自のクラスがあります。私がこだわっているのは、waveコンストラクターで2番目のパラメーターを渡して、作成される敵のサブクラスを設定する方法です。たとえば、1つのメソッドで25'Orcs'を作成するか13'Trolls'を作成します。どんな助けでも大歓迎です。

4

2 に答える 2

1

パラメータに基づいて新しいEnemyオブジェクトを作成するEnemyクラスの静的ファクトリメソッドを作成したいようです。何かのようなもの:

// EnemyType is an enum
public static Enemy createEnemy(EnemyType enemyType) {
   switch (enemyType) {
     case BASIC_MONSTER:
       return new BasicMonster();
     case ORC:
       return new Orc();
     case TROLL:
       return new Troll();
     case ..... // etc...
   }
}

渡されたパラメーターが正しいことを確認するために、intではなくenumなどのパラメーターにはよりクリーンなものを使用することに注意してください。そうしないと、-24232などのナンセンスintが渡されるリスクがあります。

于 2013-02-16T12:33:00.970 に答える
0

列挙型を使用できます

public enum EnemyType {
  ORC{
   @override
   public Enemy create() {
    return new Orc();
   }
  },
  TROLL{
   @override
   public Enemy create() {
    return new Troll();
   }
  }...etc;


  public abstract Enemy create();
}

次に、関連する列挙型をwaveメソッドに渡します。

public Collection<Enemy> createWave(final int num, final EnemyType enemyType) {
 final Collection<Enemy> enemies = new ArrayList<>(num);
 for(int i=0;i<num;i++) {
  enemies.put(enemyType.create());
 }
 return enemies;
}

異なる種類の敵がたくさんいる場合は、ジェネリックファクトリーを検討してください

public interface EmemyFactory<E extends Enemy> {
 E create();
}

次に、各敵タイプの実装を作成し、代わりに列挙型に保存します

public enum EnemyType {
  ORC(new OrcFactory()),
  TROLL(new TrollFactory()),
  ...etc;

  private final EnemyFactory enemyFactory;
  public EnemyType(final EnemyFactory enemyFactory) {
   this.enemyFactory = enemyFactory;
  }

  public Enemy create() {
   return enemyFactory.create();
  }
}

そして最後に、敵がnoargsコンストラクターを持っていると仮定して、少し反射を使用することができます。

public Collection<Enemy> createWave(final int num, final Class<? extends Enemy> enemyClass) {
 final Collection<Enemy> enemies = new ArrayList<>(num);
 for(int i=0;i<num;i++) {
  enemies.put(enemyClass.newInstance());
 }
 return enemies;
}

ただし、これは厄介で実行時エラーが発生しやすくなります...

于 2013-02-16T12:43:01.750 に答える