Создать новый экземпляр детского класса - PullRequest
0 голосов
/ 27 мая 2018

У меня есть массив списков врагов, и каждый вид врага расширяет врага.Теперь я не хочу, чтобы все враги делились всей их статистикой, но я основываю выбор врагов из другого списка массивов.Поэтому я думаю, что можно пойти путем получения объекта списка массивов, содержащего все параметры, и затем изменить их на новые экземпляры того же класса.У меня вопрос, как бы я это сделал?Или у вас, ребята, есть лучший подход?

Для простоты понимания вот что я имею в виду, абстрагированный

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 голосов
/ 27 мая 2018

Вы можете добавить 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();
...