2013-02-16 78 views
0

我试图通过for循环实现敌人的“波浪”。基本上,当一个wave对象被调用时,它会接受一个int值来设置wave中的敌人数量。每个敌人都有自己的类,它是'敌人'的一个子类。我所坚持的是我如何能够在wave构造函数中传入第二个参数来设置创建哪个敌方子类,例如创建25个'Orcs'或者使用一种方法创建13个'Trolls'。任何帮助将不胜感激。创建多个子类对象

+0

我不太确定你的意思,但是,你可以让你的构造函数接受两个参数即:public void Enemy(int a,int b) – noob 2013-02-16 12:26:35

回答

1

这听起来像你想创建一个Enemy类的静态工厂方法,根据参数创建新的Enemy对象。喜欢的东西:

// EnemyType is an enum 
public static Enemy createEnemy(EnemyType enemyType) { 
    switch (enemyType) { 
    case BASIC_MONSTER: 
     return new BasicMonster(); 
    case ORC: 
     return new Orc(); 
    case TROLL: 
     return new Troll(); 
    case ..... // etc... 
    } 
} 

注意,我会用一些清洁剂的参数,如枚举,而不是一个int,以确保在传递的参数是正确的。否则,你的风险有诸如-24232在传递一个废话INT

0

您可以使用一个枚举

public enum EnemyType { 
    ORC{ 
    @override 
    public Enemy create() { 
    return new Orc(); 
    } 
    }, 
    TROLL{ 
    @override 
    public Enemy create() { 
    return new Troll(); 
    } 
    }...etc; 


    public abstract Enemy create(); 
} 

那么相关枚举传递到你的波法:

public Collection<Enemy> createWave(final int num, final EnemyType enemyType) { 
final Collection<Enemy> enemies = new ArrayList<>(num); 
for(int i=0;i<num;i++) { 
    enemies.put(enemyType.create()); 
} 
return enemies; 
} 

如果您有很多differenet敌人类型的考虑通用工厂

public interface EmemyFactory<E extends Enemy> { 
E create(); 
} 

然后创建一个implem entation每个敌人类型,并将它们存储在枚举,而不是

public enum EnemyType { 
    ORC(new OrcFactory()), 
    TROLL(new TrollFactory()), 
    ...etc; 

    private final EnemyFactory enemyFactory; 
    public EnemyType(final EnemyFactory enemyFactory) { 
    this.enemyFactory = enemyFactory; 
    } 

    public Enemy create() { 
    return enemyFactory.create(); 
    } 
} 

而在去年和至少你可以使用一个小的反射,假设你的敌人有noargs构造:

public Collection<Enemy> createWave(final int num, final Class<? extends Enemy> enemyClass) { 
final Collection<Enemy> enemies = new ArrayList<>(num); 
for(int i=0;i<num;i++) { 
    enemies.put(enemyClass.newInstance()); 
} 
return enemies; 
} 

这是凌乱和容易到运行时错误然而...