Java 创建子类的新实例

Java 创建子类的新实例,java,class,inheritance,instance,children,Java,Class,Inheritance,Instance,Children,我有一个敌人的数组列表,每种敌人都会扩展敌人。现在我不想让每一种敌人都分享他们的所有数据,但我会根据我的敌人选择另一个阵法列表。因此,我认为方法是获取包含所有选项的数组列表的对象,然后将它们更改为同一类的新实例。我的问题是,我该怎么做?或者你们有更好的方法吗 为了便于理解,这里是我所说的抽象的意思 class shop{ ArrayList<Enemy> allEnemies; } class generator{ ArrayList<Enemies> sel

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

为了便于理解,这里是我所说的抽象的意思

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());
  }
}
class商店{
ArrayList allEnemies;
}
类生成器{
ArrayList selectedToGenerate=基于某些关联
对于(敌人x:selectedToGenerate){//我知道这不起作用
x=newInstanceOf(x.getNonenemyThereforeChildclassClass());
}
}

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

你可以在你的
敌人
中添加一个
Builder

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;
       }
   }
}
现在,您可以使用敌人的构建器创建敌人的副本:

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

那么
敌军
是基类,您在该列表中有
EnemyA
EnemyB
等子类?基本上,您需要列表的副本,但是对于新实例,这很重要:您是否计划向应用程序中添加新的敌人种类?你能举例说明你如何使用敌人吗。我在考虑两种模式:
Factory
Builder
。嘿,非常感谢!诚然,我还不是最好的Java程序员,尽管这很令人伤心。尽管如此,我还是非常期待了解构建器,但多亏了您的解决方案,我现在将添加一个地图作为快速修复。非常感谢您的帮助:)
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();