2015-06-14 2 views
0

Итак, я строю очень базовую программу, основанную на настольной игре Warhammer 40k, в качестве дополнительного кредитного задания для моего класса Comp Sci. Я получаю разработку спецификаций, а затем реализую спецификации. В этой игре, у меня есть класс армия, которая имеет ArrayList из класса единиц:Как добавить разные внутренние классы в ArrayList?

List<Units> unitsList = new ArrayList<Units>();

я создал Паи класса с innerclasses, которые содержат различные типы единицы. Таким образом, фрагмент кода, который был бы:

public class Units 
{ 
    int strength, toughness, attacks, save, wounds; 
    class TroopUnit 
    { 
     public static final int strength = 3; 
     public static final int toughness = 3; 
     public static final int attacks = 1; 
     public static final int save = 5; 

     public int wounds = 1; 
    } 

    class EliteTroopUnit 
    { 
     public static final int strength = 3; 
     public static final int toughness = 3; 
     public static final int attacks = 1; 
     public static final int save = 4; 

     public int wounds = 1; 
    } 

} 

Есть несколько типов блоков, но я думаю, что вы можете получить эту идею. Я попытался добавить это различное innerclasses из блоков внутри блоков ArrayList:

public Army(int troopPoints, int eliteTroopPoints, int commandPoints, 
    int commandTroopPoints, int fastAttackPoints, int heavyAttackPoints) 
{  
    for (int i = 0; i < (troopPoints/TROOP_COST); i++) 
     if (troopPoints % TROOP_COST == 0) 
     { 
     if (points < MAX_POINTS) 
     { 
      unitsList.add(new Units.TroopUnit()); 
      points += TROOP_COST; 
      numUnits++; 
     } 
     } 
    for (int i = 0; i < (eliteTroopPoints/ELITE_TROOP_COST); i++) 
     if (eliteTroopPoints % ELITE_TROOP_COST == 0) 
     { 
     if (points < MAX_POINTS) 
     { 
      unitsList.add(new Units.EliteTroopUnit()); 
      points += ELITE_TROOP_COST; 
      numUnits++; 
     } 
     } 
} 

Однако, я бег в проблему, потому что я должен объявить и создать экземпляр ArrayList с определенным типом InnerClass для того, чтобы добавить внутренний класс к нему. Например, List<Units.someUnitInnerClass> unitsList = new ArrayList<Units.someUnitInnerClass();

Итак, есть ли обходной путь для этой проблемы, где я могу добавить любой из внутренних классов в ArrayList? Неужели я неправильно делаю эту проблему? Если да, то каковы другие альтернативы? Спасибо!

EDIT: Первоначально я перечислил это как «Как добавить различные подклассы к ArrayList, но это была ошибка (скорректированный Rudi Kershaw)

ответ

2

В примере кода вы дали, TroopUnit и EliteTroopUnit есть. . не подтипы Unit они inner classes

Если вы хотите, чтобы они были подклассы Unit, они должны продлитьUnit Например,..

public class Unit {} 
public class TroopUnit extends Unit {} 

В приведенном выше примере TroopUnit распространяется (и, следовательно, подклассом) Unit. С быстрым взглядом кажется, что вы можете просто добавить extends Unit в конец ваших внутренних деклараций классов, и он должен делать то, что вы намерены.

Надеюсь, это поможет.

Ссылки & Дополнительная литература:

+0

вы совершенно правы, я имел в виду внутренние классы. Позвольте мне это исправить. Хорошо, позвольте мне попробовать это решение - спасибо. – Choonkies

+0

Хорошо, это сработало. Мне пришлось изменить внутренние классы на статические внутренние классы, чтобы я мог создавать внутренние классы в ArrayList. Например, статический класс TroopUnit расширяет Units Кроме того, спасибо! – Choonkies

+0

@ OmarPatel - Без проблем, я рад, что смогу помочь. Если ваша проблема решена, не забудьте принять ответ, который вам больше всего помог, щелкнув серый тик рядом с ответом. –

0

Прежде всего, подкласс должен расширяет класс.как это:

public class TroopUnit extends Units{} 

Во-вторых, ответ на ваш вопрос название, которое не имеет отношения к вашей проблеме кода, является то, что вы должны получить класс выше в иерархии, чем ваш объект, который вы добавляете в список, и потому в Java Object является родителем всех классов, то вы можете создать экземпляр списка, как это:

List<Object> unitsList = new ArrayList<Object>(); 
+0

Ах, я совсем забыл, что могу это сделать. Спасибо за совет. – Choonkies

+0

@OmarPatel Но подумайте, чтобы ваш код был правильным. Используйте правильные условия наследования в вашем коде. –

Смежные вопросы