【发布时间】:2016-10-11 20:19:42
【问题描述】:
我有一个名为 Enemy 的基类和各种 Enemy 类型的子类,例如 BigEnemy、LazerEnemy、AvoidingEnemy 等。
我有一个 Formation 类,其目的是创建专门的敌人阵型,例如线、网格、金字塔。
我希望 Formation 将我想要创建的 Enemy 子类的类型作为参数。
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
目前我打算做一些事情,比如传递一个名为enemyType的字符串(或者它可能只是一个整数并执行switch语句),但由于我有这么多敌人类型,我想知道是否有一种更简洁的方法来传递我要实例化的不需要使用 switch 语句的对象的类型。
也许这与Factory和this问题有关,但我不太明白。
谢谢
【问题讨论】:
-
为什么不能直接传递
new LazerEnemy()或new BigEnemy(),而Formation构造函数将Enemy作为第一个参数? -
您有三个选项,1) 使用条件分支开关或 if-else,2) 使用反射并传入类,例如LazerEnemy.class, 3) 有不同的工厂方法,例如Formation.createBigEnemy("line", 10);
-
@Tunaki 所以你是说,将子类对象作为参数传递给 Formation,如 Formation (new LazerEnemy(), "pyramid", 4),然后 Formation 的构造函数会做什么?我必须创建多个新的敌人类型。编队(敌人 e,字符串 ftype,整数) { } 。我现在需要创建多个敌人。我应该克隆 e 吗?
-
哈,在这种情况下,如果你在 Java 8 下,我会传递一个
Supplier<Enemy>。每次调用get()都会返回一个新的敌人实例。然后你可以使用new Formation(BigEnemy::new, ...)
标签: java inheritance subclass