0

我试图通过 for 循环来实现敌人的“浪潮”。基本上,当一个波对象被调用时,它接受一个设置波中敌人数量的 int。每个敌人都有自己的类,它是“敌人”的子类。我坚持的是如何在波构造函数中传递第二个参数来设置创建哪个敌人子类,例如在一种方法中创建了 25 个“兽人”或 13 个“巨魔”。任何帮助将不胜感激。

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,以确保传入的参数是正确的。否则,您可能会传入一个无意义的 int,例如 -24232。

于 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();
  }
}

最后,假设你的 Enemies 有一个 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 回答