2015-04-30 3 views
-1

Я зацикливание через мой медиа Список_массивов ArrayList, который имеет несколько дочерних классов (аудио, видео, фото) И когда я Переберите мой медиа ArrayListПолучить дочерний класс, когда цикл по его родительского класса Java

public double getTotalVideoRunTime() 
    { 
     int total = 0; 
     for(Media v : mList) 
     { 
      if(v.isVideo()) 
      { 

      } 
     } 
     return total; 
    } 

Я не уверен, как получить «runtime», которая является переменной из класса видео, мне нужно циклически менять ее? Я не уверен, как я могу получить переменные из дочерних классов, я предполагаю, что это возможно (я надеюсь!)

+0

Чего вы хотите достичь? Вы хотите назвать конкретные методы? – Tom

ответ

1

Вы должны использовать instanceof и направить его в нужный класс.

например.

if(v instanceof Video){ 
Video a = (Video) v; 
a.childMethodOfVideo(); 
} 

if(v instanceof Audio){ 
Audio a = (Audio) v; 
a.childMethodOfAudio(); 
} 
+1

Использование 'instanceof' в этом контексте - огромный запах кода. – amit

+1

@amit Почему это было бы? –

+1

@MuratK. Это похоже на «большой» if/else блок или аналогичный переключатель: если вы забудете сохранить это обновление, то этот код будет нарушен. Здесь было бы гораздо лучше использовать полиморфизм. – Tom

1

Не совсем уверен, что вы пытаетесь достичь, но если вы хотите переменные определенный класс имеет, вы можете использовать reflection API для него:

Field[] fields = v.getClass().getFields(); 
for (Field f : fields) System.out.println(f.getName()); 

Аналогично, если вы хотите методы :

Method[] methods = v.getClass().getMethods()(); 
for (Method m : methods) m.invoke(arguments...); 

Я должен предупредить вас, что с помощью отражения имеет много недостатков (производительность, безопасность) - и много раз, если вам нужно используйте его, он указывает code smell.


Если вы пытаетесь сделать некоторые специфические свойства для определенного класса, правильный способ сделать это, это реализовать его как абстрактный метод, и назвать его - динамический тип будет выбран, и нужный метод будет можно называть:

public abstract static class Media { 
    abstract public void foo(); 
} 
public static class Video extends Media{ 
    @Override 
    public void foo() { 
     System.out.println("video"); 

    } 
} 
public static class Image extends Media{ 
    @Override 
    public void foo() { 
     System.out.println("image"); 

    } 
} 

public static void main(String ar[]) { 
    Media m = new Video(); 
    m.foo(); 
} 
+0

Я думаю, он просто хочет получить доступ к дочерним методам. –

+0

Как абстрактный класс вообще решает эту ситуацию? У него есть список, содержащий дочерние классы, которые могут иметь специфические для детей методы. –

+1

@MuratK. вы улавливаете общее поведение в интерфейсе/абстрактном классе и заставляете конкретные реализации заботиться о различиях. Это ТОЧНО роль абстрактных методов. – amit

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