嗨我有一個父類是Abstract Employee
,我有孩子Secretary, Engineer, Technician
如果我有ArrayList<Employee> employees;
並且在for循環中,我已隨機創建員工=新的祕書或新工程師。區分父類的數組列表中的每個兒童班級
有沒有辦法知道誰是誰?如果這個問題沒有得到很好的答覆,我對此表示歉意。
嗨我有一個父類是Abstract Employee
,我有孩子Secretary, Engineer, Technician
如果我有ArrayList<Employee> employees;
並且在for循環中,我已隨機創建員工=新的祕書或新工程師。區分父類的數組列表中的每個兒童班級
有沒有辦法知道誰是誰?如果這個問題沒有得到很好的答覆,我對此表示歉意。
理想情況下,你應該不在乎。如果您需要根據具體的類別做不同的事情,那麼它應該進入Employee
的一個(可能是抽象的)方法,其中的子類覆蓋和實現不同。然後,您只需瀏覽列表並在每個元素上調用該方法即可。
這將是適當的面向對象的設計。
無論您需要每位員工做什麼,例如employee.work()。每個員工都知道他們需要做什麼,而不是調用者/循環代碼。 – 2010-12-04 14:20:12
您可以使用instanceof
本地運算符。
事情是這樣的:
List<Employee> yourList;
for (Employee e : yourList) {
if (e instanceof Secretary) {
Secretary s = (Secretary)e;
// do something with s
} else if (e instanceof Engineer) {
Engineer eng = (Engineer)e;
// do something with eng
}
// you get the idea...
}
話雖如此,濫用的instanceof
使用並不總是一個好主意。通過在班級中使用多態性,您將擁有更清晰的更多面向對象的解決方案。
您當然可以使用instanceof
,但它會打敗您設計的目的。每次添加員工的另一個子類型時,您都必須修改潛在的大量代碼 - 在此列表上運行的每個地方。
另一種可以減少更改次數(或至少將它們保存在一個可管理的地方)的方法是使用訪問者模式或多態性讓代碼根據運行時的類型找出要執行的操作。
我強烈建議你在這些情況下實施visitor pattern。
您可能也想看看一個完整的例子over here這由Lion
S和Deer
s擴展的Animal
的List的情況下解決這個問題的精確。
(請注意,有時祕書會晉升爲工程師。) – 2010-12-04 14:15:00