创建新的子类实例

时间:2018-05-27 07:17:47

标签: java class inheritance instance children

我有一个敌人阵列列表,每个敌人都会扩展敌人。现在我并不是每个同样的敌人都可以分享他们的所有统计数据,但我的敌人选择是另一个阵列列表。所以我认为要采用的方法是获取包含所有选项的数组列表的对象,然后将它们更改为同一类的新实例。我的问题是,我该怎么做?或者你们有更好的方法吗?

为了便于理解,我的意思是抽象的

class shop{
   ArrayList<Enemy> allEnemies;
}

class generator{
  ArrayList<Enemies> selectedToGenerate = based on some of allEnemies

  for(Enemy x : selectedToGenerate){ // i know this wouldn't work
    x = newInstanceOf(x.getNonenemyThereforeChildclassClass());
  }
}

希望这能解释我的意思。感谢你的时间!

1 个答案:

答案 0 :(得分:0)

您可以向Builder添加Enemy

abstract class Enemy {
   private int strength;
   public Builder<Enemy> getBuilder();
   public static class Builder<T extends Enemy> {
       int str;
       public Builder<T> copyValues(T enemy) {
           str = enemey.strength;
           return this;
       }
       public Builder<T> strength(int s) {
           str = s;
           return this;
       }
       protected void fillValues(T toFill) {
           toFill.strength = str;
       }
       protected abstract T createInstance();
       public T build() {
           T result = createInstance();
           fillValues(result);
           return result;
       }
   }
}

Builder可以创建Enemy的实例,并用值填充它。对于子类,您可以通过允许它填充更多值来扩展Builder

class EnemyA extends EnemyA {
    private int speed;
    public Builder<EnemyA> getBuilder() {
        return new Builder();
    }

    class EnemyABuilder extends Builder<EnemyA> {
        int speed;
        public EnemyABuilder copyValues(EnemyA enemy) {
            super.copyValues(enemy);
            speed = enemy.speed;
        }
        public EnemyABuilder speed(int s) {
            speed = s;
            return this;
        }
        protected void fillValues(EnemyA toFill) {
            super.fillValues(toFill);
            toFill.speed = speed;
        }
        protected EnemyA createInstance() {
            return new EnemyA();
        }
    }
}

现在,您可以使用他们的构建器创建敌人的副本:

for(Enemy x : selectedToGenerate){ // i know this wouldn't work
    Builder<? extends Enemy> builder = x.getBuilder();
    builer.copyValues(x);
    Enemy copy = builder.build();
}

作为额外奖励,您可以使用构建器快速创建同一敌人的不同版本。

EnemyA.Builder base = new Builder().strength(10);
EnemyA withSpeed1 = base.speed(1).build();
EnemyA withSpeed2 = base.speed(2).build();    
EnemyA withSpeed3 = base.speed(3).build();