我有一个名为 Enemy 的基类和 Enemy 类型的各种子类,例如 BigEnemy、LazerEnemy、AvoidingEnemy 等。

我有一个 Formation 类,其目的是创建专门的敌人编队,例如线、网格、金字塔。

我希望 Formation 将我想要创建的敌人的子类类型作为参数。

Formation f = new Formation("LazerEnemy","triangle", 4); // makes a triangle formation of lazer enmies
Formation f = new Formation("BigEnemy","line", 10); // makes a line of big enemies

目前我打算做一些事情,比如传递一个名为敌人类型的字符串(或者它可以只是一个整数并执行 switch 语句),但是由于我有这么多敌人类型,我想知道是否有一种更简洁的方法来传递类型我想实例化不需要使用 switch 语句的对象。

也许这与Factory和this问题有关,但我不太明白。

谢谢

最佳答案

如果我理解正确,则 Formation 构造函数必须能够创建给定类型敌人的多个实例。不要将敌人的类型作为字符串或类传递,您应该简单地为 Formation 提供一种创建敌人的方法,即工厂或敌人的供应商:

public clas Formation<E extends Enemy> {

    // we'll store them in a list
    private List<T> enemies;

    public Formation(Supplier<E> enemySupplier, int count) {
        enemies = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            enemies.add(enemySupplier.get());
        }
    }
}

如果 LazerEnemy 具有无参数构造函数,则您可以通过这种方式创建 LazerEnemy 的形成:
Formation<LazerEnemy> f = new Formation<>(LazerEnemy::new, 10);

假设 LazerEnemy 构造函数需要其激光强度,您可以使用
int strenth = 5;
Formation<LazerEnemy> f = new Formation<>(() -> new LazerEnemy(strength), 10);

所以,简而言之,让调用者决定并指定必须如何创建编队中的敌人,而不是强制编队知道如何创建所有类型的敌人。

关于java - 在 Java 中选择没有 switch 语句的子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37755446/

10-14 09:10