有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java创建多个子类对象

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


共 (1) 个答案

  1. # 1 楼答案

    可以使用枚举

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

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