2013-02-16 73 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; 
} 

這是凌亂和容易到運行時錯誤然而...