我正试图通过for循环实现敌人的'波浪'。基本上当调用wave对象时,它接受一个int来设置wave中的敌人数量。每个敌人都有自己的类,它是“敌人”的子类。我坚持的是如何在wave构造函数中传递第二个参数来设置创建哪个敌人子类,例如在一个方法中创建了25个“Orcs”或13个“Trolls”。任何帮助将不胜感激。
答案 0 :(得分: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,以确保传入的参数是正确的。否则你可能会冒一个无意义的int,比如传入-24232。
答案 1 :(得分: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;
}
这很麻烦,容易出现运行时错误......