2015-03-08 2 views
0

У меня есть List<Task> tasksToDo, который содержит много разных объектов. Некоторые из них не являются объектами Task, но TimingTask объектов, которые являются унаследованными от класса Task. Мой вопрос заключается в том, что, когда я пытаюсь перебрать этот список, используя следующий:Iterate over Список унаследованных объектов класса

for(Task theTask: tasksToDo) 
{ 

} 

Как я могу использовать те методы, которые есть внутри TimingTask объекта, если объект этого типа? Тип объекта TimingTask имеет метод, называемый getAdd, который присутствует только в этом типе. Поэтому, когда я пытаюсь с theTask.getAdd, я получаю сообщение об ошибке, поскольку метод getAdd отсутствует в классе класса Task.

+6

Если вы хотите обработать 'Task' объекты, такие как' TimingTask' объекты, перемещение '' getAdd' в Task'. – Smutje

+0

Я согласен с @Smutje. См. Http://en.wikipedia.org/wiki/Liskov_substitution_principle – Elist

ответ

1

использование instanceof:

for(Task theTask: tasksToDo) { 

    if (theTask instanceof TimingTask) { //if theTask is an istance of the class TimingTask 
     TimingTask theTimingTask = (TimingTask)theTask; 
     //now you can use theTimingTask.getAdd(); 
    } else { 
     //theTask is not an instance of the class TimingTask 
    } 
} 
0
for(Task theTask: tasksToDo) 
{ 
    ((TimingTask)theTask).getAdd(); 
} 

Если вы хотите, чтобы проверить сначала theTask является экземпляром TimingTask, используйте instanceof:

if(theTask instanceof TimingTask) 
    ((TimingTask)theTask).getAdd(); 
2

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

+0

Я понимаю это, однако я не вижу лучшего способа справиться с этим сценарием. Если у меня разные типы задач, которые нужно повторить, поскольку я не верю, что все эти типы должны быть в одном классе. Это сделало бы этот класс запутанным вместо этого цикла. –

+0

Более ранний комментарий о добавлении метода к альтернативе. но в вашем случае здесь кажется, что единственным реальным вариантом является проверка экземпляра. – LhasaDad

-1

Ther является возможным решением для вашей проблемы

for(Task theTask: tasksToDo){ 
     if (theTask instanceof TimingTask){ 
      TimingTask theTimingTask = (TimingTask)theTask; 
      //Your treatments for your theTimingTask objects 
     }else{ 
      //If you need other treatments for only the Task objects and your other different objects 
     } 
    }