2015-03-08 66 views
0

我有一個List<Task> tasksToDo,它擁有許多不同的對象。其中一些不是Task對象,而是TimingTask對象,它是繼承自Task類的類。我的問題是,當我嘗試使用遍歷這個列表如下:循環遍歷繼承的類對象列表

for(Task theTask: tasksToDo) 
{ 

} 

我如何使用的方法是一個TimingTask對象的內部,如果對象是那種類型的? TimingTask對象類型具有名爲getAdd的方法,該方法僅存在於該類型中。因此,當我嘗試使用theTask.getAdd時,出現getAdd方法在Task類類型中不存在的錯誤。

+6

一個可能的解決方案。如果你要正確對待'Task'對象,如'TimingTask'對象,此舉'getAdd'成'Task'。 – Smutje 2015-03-08 20:24:53

+0

我同意@Smutje。見http://en.wikipedia.org/wiki/Liskov_substitution_principle – Elist 2015-03-08 20:34:31

回答

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

我明白這一點,但我沒有看到處理這種情況的更好方法。如果我有不同的任務類型需要迭代,因爲我不認爲所有這些類型應該在一個類中。這隻會讓這個類混淆,而不是這個循環。 – 2015-03-08 20:33:10

+0

先前有關將該方法添加到替代方法的評論。但在你的情況下,似乎唯一真正的選擇是檢查實例。 – LhasaDad 2015-03-09 00:07:55

-1

療法是你的問題

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