目前我正在制作游戏,事情进展顺利。让我忙碌的是,正在制作一个在某个地区产生小怪的怪物产卵者。
现在最大的问题是,我不确定如何跟踪产卵者产生的所有怪物,因为怪物有不同的遗传。
这是我的MobSpawner类:
public class MobSpawner {
protected List<Mob> mobs;
protected Level level;
protected int timer = 0;
protected int spawnTime = 0;
protected int maxMobs = 0;
public MobSpawner(Level level) {
this.level = level;
}
}
这是我的RoachSpawner课程:
public class RoachSpawner extends MobSpawner {
public RoachSpawner(Level level) {
super(level);
mobs = new ArrayList<Roach>(); // Roach is an extension of Mob
}
}
这不会起作用,因为List和ArrayList必须属于同一类型。
所以问题是,有没有人有任何其他想法如何做到这一点?
提前致谢!
答案 0 :(得分:3)
我假设Roach extends Mob
。
您可以使用ArrayList<Mob>
来保留Roach
个。所以:
public RoachSpawner(Level level) {
super(level);
mobs = new ArrayList<Mob>();
}
如果您只是在所有实现中使用ArrayList<Mob>
,则可以在基础中分配它(假设ArrayList
始终是您想要的容器 - 如果您想使用其他{{1类型见kwah的答案,并有子类创建列表):
List
让子类使用base的列表。
在基类中实例化列表并使其成为public class MobSpawner {
protected final List<Mob> mobs = new ArrayList<Mob>();
...
}
会产生额外的副作用,让您说明以下不变量(假设您没有用反射或任何东西来违反它们):
final
永远不会有空MobSpawner
和mobs
将在mobs
的整个生命周期内引用同一个对象。 能够做出这些假设可能会简化其他地方的一些逻辑。
使它MobSpawner
在编译时也强制执行,你不会无意中将其替换为其他列表。
答案 1 :(得分:1)
如果您还没有这样做,请尝试利用超类型。
就像您可以将变量声明为List
然后将其实例化为ArrayList
一样,请尝试说明List
包含Character
个项目,然后用特定的字符实现填充它(例如List<Character>
被实例化为ArrayList<Mob>
和ArrayList<Roach>
)。
public abstract class Character { }
public class Mob extends Character { }
public class Roach extends Character { }
public class Spawner {
protected List<? extends Character> characters;
protected Level level;
protected int timer = 0;
protected int spawnTime = 0;
protected int maxCharacters = 0;
public Spawner(Level level) {
this.level = level;
}
}
public class RoachSpawner extends Spawner {
public RoachSpawner(Level level) {
super(level);
mobs = new ArrayList<Roach>();
}
}
public class MobSpawner extends Spawner {
public RoachSpawner(Level level) {
super(level);
mobs = new ArrayList<Mob>();
}
}