1

目前我正在开发一款游戏,一切进展顺利。让我现在很忙的是制作一个在特定区域产生暴徒的暴民生成器。

现在最大的问题是,我不确定如何跟踪生成器生成的所有生物,因为生物有不同的继承。

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

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

提前致谢!

4

2 回答 2

3

我假设Roach extends Mob.

你可以使用 anArrayList<Mob>来持有Roaches。所以:

public RoachSpawner(Level level) {
    super(level);
    mobs = new ArrayList<Mob>();
}

如果您只是ArrayList<Mob>在所有实现中使用,则可以在基础中分配它(假设ArrayList始终是您想要的容器 - 如果您想使用其他List类型,请参阅 kwah 的答案并让子类创建列表):

public class MobSpawner {

    protected final List<Mob> mobs = new ArrayList<Mob>();

    ...

}

并且只让子类使用基类的列表。

在基类中实例化列表并使其final具有额外的副作用,即让您声明以下不变量(假设您没有通过反射或任何东西违反它们):

  • AMobSpawner永远不会有 null mobs,并且
  • mobs将在 a 的整个生命周期中引用同一个对象MobSpawner

能够做出这些假设可能会简化您在其他地方的一些逻辑。

在编译时,它final还会强制您不会无意中将它替换为某个地方的另一个列表。

于 2013-08-18T00:38:43.583 回答
1

如果您还没有这样做,请尝试利用超类型。

就像您可以将变量声明为 aList然后将其实例化为 an 一样ArrayList,尝试说出您的ListcontainsCharacter项目,然后用 Characters 的特定实现填充它(例如List<Character>,实例化为ArrayList<Mob>and 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>();
    }

}
于 2013-08-18T00:49:20.897 回答