【问题标题】:Creating multiple subclass objects创建多个子类对象
【发布时间】:2013-02-16 12:16:48
【问题描述】:

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

【问题讨论】:

  • 我不太清楚你的意思,但是你可以让你的构造函数接受两个参数,即:public void Enemy(int a, int b)

标签: java object methods for-loop subclass


【解决方案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。

【讨论】:

    【解决方案2】:

    你可以使用枚举

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

    这很混乱,而且很容易出现运行时错误……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多