2017-01-21 3 views
0

У меня есть суперкласс, из которого простираются несколько разных подклассов. Каждый подкласс тогда имеет конкретные методы для этого конкретного класса, что другие подклассы не могут следовать. то есть:Доступ к методам ArrayList с несколькими типами объектов в

  • NMEA общественного класса ... методы, которые все подклассы держат
  • общественного класс GPGGASentence расширяет NMEA .. имеют некоторый определенный метод для этого типа
  • общественного класс GPGPSSentence расширяет NMEA .. имеют некоторый определенный метод к этому типу

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

ArrayList<NMEA> sentences = new ArrayList<>(); 

switch (s.split(",")[0]){ 
    case "$GPGGA": 
      sentences.add(new GPGGASentence(s)); 
      break; 
    case "$GPGPS": 
      sentences.add(new GPGPSSentence(s)); 
      break; 
} 

Я сейчас добираюсь до точки, в которой я хочу пройти через этот массив ArrayList. В настоящее время я делаю следующее:

for(NMEA nmea : sentences){ 
    if(nmea instanceof GPGGASentence){ 
      system.out.println((GPGGASentence) nmea).someSpecificMethod()); 
    } 
} 

Мне было интересно, если это их лучший способ сделать это.

+2

Это флаг reg. Вам нужно кодировать интерфейсы. Потратьте некоторое время на чтение шаблонов проектирования. – OldProgrammer

+0

Я рекомендую удалить определенные методы из подклассов и вместо этого переопределить абстрактный метод в каждом из подклассов. – 4castle

+0

Ваш суперкласс должен реализовать все возможные методы, вы их вызовете, и они могут просто ничего не делать. –

ответ

-1

Помимо написания abstract class/interface и объявить все методы, это то, что вы можете сделать, чтобы улучшить redability кода:

  • Создать учетную enum всех возможных типов класса
  • Написать метод, который возвращает значение перечисления для объекта
  • Используйте switch с различными случаями.

Вот пример. Объявляет перечисление, как показано ниже:

private enum ClassType { 
    NMEA, 
    GPGGASentence, 
    SomeOtherType, 
    Unknown; 
} 

Теперь способ вернуть type:

private ClassType getClassType(NMEA object){ 
    ClassType type = null; 
    try{ 
     type = ClassType.valueOf(object.getClass().getSimpleName()); 
    }catch(IllegalArgumentException e){ 
     type = ClassType.Unknown; 
    } 
    return type; 
} 

Теперь, используйте его с switch внутри for цикла:

for(NMEA nmea : sentences){ 
    switch(getClassType(nmea)){ 
    case ClassType.NMEA : 
     //do something 
     break; 
    } 
} 

Если новый Impl класс добавляется в будущем (или изменяется имя любого класса), все, что вам нужно сделать, это добавить значение enum и switch case.

+0

@downvoter помочь объяснить? –

0

Мое решение этой проблемы состояло в том, чтобы предлагать изменить класс NMEA в абстрактный класс и перечислить все методы внутри этого класса, а затем переопределить их.

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