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