2013-02-16 4 views
0

for 루프를 통해 적의 '물결'을 달성하려고합니다. 기본적으로 wave 객체가 호출되면 wave의 적수를 설정하는 int를 허용합니다. 각각의 적들은 '적 (Enemy)'의 하위 클래스 인 자신의 클래스를가집니다. 내가 갇혀있는 방법은 웨이브 생성자에서 두 번째 매개 변수를 전달하여 적의 하위 클래스가 만들어 지도록 설정하는 방법입니다. 예를 들어 25 개의 Orcs가 생성되었거나 13 개의 트롤이 한 가지 방법으로 생성되었습니다. 어떤 도움이라도 대단히 감사하겠습니다.여러 하위 클래스 객체 만들기

+0

나는 당신이 무슨 뜻인지 잘 모르겠지만 생성자가 두 개의 매개 변수를 받아들이도록 만들 수 있습니다 : public void Enemy (int a, int b) – noob

답변

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로가 전달되는 실제적인 지능을 가진 위험

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을 만듭니다.

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; 
} 

이 지저분하고 경향이있다 : 각 적 유형에 대한 entation과 원수가 NOARGS 생성자가 가정 열거하는 대신

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(); 
    } 
} 

그리고 마지막으로하고 적어도 당신은 약간의 반사를 사용할 수에 저장 그러나 런타임 오류에 ...

관련 문제