2010-12-04 5 views
0

안녕하세요 부모 클래스가 Abstract Employee이고 어린이가 있습니다 Secretary, Engineer, TechnicianArrayList<Employee> employees;이 있고 for 루프에 임의로 직원 = 새로운 비서 또는 새로운 엔지니어가 있습니다.부모 클래스의 arraylist의 각 어린이 클래스를 구분합니다

누가 누군지 알 수있는 방법이 있습니까? 질문에 잘 대답하지 않으면 내 무지를 사과한다.

+0

(비서가 엔지니어에게 전달되는 경우가 있습니다.) –

답변

5

이상적으로는 신경 쓰지 말아야합니다. 특정 클래스에 따라 다른 작업을 수행해야하는 경우 Employee의 (추상적 인) 메소드로 이동해야합니다.이 메소드는 하위 클래스가 다른 방식으로 재정의하고 구현합니다. 그런 다음 목록을 살펴보고 모든 요소에 대해 해당 메서드를 호출하면됩니다.

이것은 적절한 객체 지향 설계입니다.

+0

각 직원이해야 할 일이 무엇이든간에. employee.work(). 각 직원은 호출자/루프 코드가 아니라 필요한 작업을 알고 있습니다. –

+0

그래, 그게 내가 원하는 "O - O를 설계 적절한"나는 다른 사람들이 제안하는 것처럼 방문자 패턴으로 다이빙합니다 :) 감사합니다 Logged –

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의 사용을 남용하는 것은 항상 좋은 생각이 아니다,라고 말했다 가졌어요. 클래스에서 다형성을 사용하면보다 객체 지향적 인 솔루션을보다 깨끗하게 사용할 수 있습니다.

0

확실히 instanceof을 사용할 수 있지만 디자인의 목적을 상실합니다. Employee의 다른 하위 유형을 추가 할 때마다 잠재적으로 많은 코드 (이 목록에서 작동하는 모든 장소)를 수정해야합니다.

변경 횟수를 줄이거 나 (적어도 관리 할 수있는 장소에 유지하는) 다른 방법은 방문자 패턴 또는 다형성을 사용하여 런타임에 유형에 따라 코드에서 취할 수 있도록하는 것입니다.

1

이와 같은 상황에서 visitor pattern을 구현하는 것이 좋습니다.

는 또한 완전한 예를 Lion들과 Deer의 확장 Animal의 목록의 내용이 정확한 문제를 해결 over here보고 할 수 있습니다.

관련 문제