创建多个子类对象

时间:2013-02-16 12:16:48

标签: java object methods for-loop subclass

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

2 个答案:

答案 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;
}

这很麻烦,容易出现运行时错误......