我有一个名为Enemy的基类和各种Enemy类型的子类,如BigEnemy、LazerEnemy、AvoidingEnemy等。
我有一个队形类,它的目的是创建敌人的特殊队形,比如直线,网格,金字塔。
我希望编队能接受我想要创建的敌人的子类类型作为参数。
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语句。
也许这与工厂和this问题有关,但我不太理解它。
谢谢
发布于 2016-06-11 03:15:09
如果我理解正确的话,编队构造器必须能够创建给定类型敌人的多个实例。而不是传递类型的敌人作为字符串或类,您应该简单地给队形一种方法来创建敌人,即工厂,或供应商的敌人:
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构造函数的lazer需要一个强度,您可以使用
int strenth = 5;
Formation<LazerEnemy> f = new Formation<>(() -> new LazerEnemy(strength), 10);因此,简而言之,让呼叫者决定并指定如何创建队形中的敌人,而不是强迫队形知道如何创建所有类型的敌人。
发布于 2016-06-11 03:22:01
您可以将类型作为参数传递给方法。
Formation f = new Formation(LazerEnemy.class, Shape.LINE, 4)
public formation(Class<? extends Enemy> enemyType, Shape shape, int num) {
Enemy enemy1 = enemyType.newInstance();
...
}不过,你需要一个try
发布于 2016-06-11 03:06:53
有很多方法可以解决这个问题。其中之一就是使用Dependency Inversion principle。也就是说,new Formation()构造函数的调用者也可以创建敌人:
Formation f1 = new Formation(new LazerEnemy(), "triangle", 4);
Formation f2 = new Formation(new BigEnemy(), "line", 10);如果这些敌人有很长的构造函数,那么你可以使用依赖注入框架。Google guice是相对容易设置的。
https://stackoverflow.com/questions/37755446
复制相似问题