我有一个敌人阵列列表,每个敌人都会扩展敌人。现在我并不是每个同样的敌人都可以分享他们的所有统计数据,但我的敌人选择是另一个阵列列表。所以我认为要采用的方法是获取包含所有选项的数组列表的对象,然后将它们更改为同一类的新实例。我的问题是,我该怎么做?或者你们有更好的方法吗?
为了便于理解,我的意思是抽象的
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());
}
}
希望这能解释我的意思。感谢你的时间!
答案 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();