嗨,我有一个Abstract Employee
的父类,我有孩子Secretary, Engineer, Technician
如果我有ArrayList<Employee> employees;
并且在for循环中我随机创建了employee =新秘书或新工程师。 ..
有没有办法知道谁是谁?如果问题没有得到很好的解答,请为我的无知道歉。
答案 0 :(得分:5)
理想情况下,你不应该在乎。如果你需要做不同的事情,具体取决于它是哪个特定的类,那么它应该进入Employee
中的一个(可能是抽象的)方法,子类覆盖并实现不同的方法。然后,您只需浏览列表并在每个元素上调用该方法。
这将是适当的面向对象设计。
答案 1 :(得分:1)
您可以使用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
并不总是一个好主意。通过在类中使用多态,您将拥有更清洁的面向对象的解决方案。
答案 2 :(得分:1)
我强烈建议您在这种情况下实施visitor pattern。
您可能还希望在Animal
扩展的Lion
列表的上下文中查看完整的示例over here 来解决此问题。 s和Deer
s。
答案 3 :(得分:0)
你当然可以使用instanceof
,但它会破坏你设计的目的。每次添加另一个Employee子类型时,您都必须修改可能的大量代码 - 在此列表中运行的每个位置。
另一种可以减少更改次数(或至少将它们保存在一个可管理位置)的方法是使用访问者模式或多态来让代码根据运行时的类型确定要执行的操作。