如何制作可扩展的ArrayList?

时间:2013-08-18 00:32:56

标签: java

目前我正在制作游戏,事情进展顺利。让我忙碌的是,正在制作一个在某个地区产生小怪的怪物产卵者。

现在最大的问题是,我不确定如何跟踪产卵者产生的所有怪物,因为怪物有不同的遗传。

这是我的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必须属于同一类型。

所以问题是,有没有人有任何其他想法如何做到这一点?

提前致谢!

2 个答案:

答案 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>();
    }

}