2014-11-10 5 views
2

프로젝트에는 4 개의 클래스가 있습니다. 사람, 사람을 확장하는 직원 및 직원을 확대하는 학업. 나는 Array에 대한 사용자가 만든 대안 인 Store도 가지고 있습니다. Store의 함수 중 하나는 'elementAt()'입니다.이 요소는 Store에서 객체를 반환합니다.Controller 클래스의 instanceOf가 정상입니까? (다른 클래스는 편집 할 수 없습니다.)

내가 가진 문제는 elementAt()가 항상 Person 유형으로 반환된다는 것입니다. 이는 Controller 클래스에서 사용자가 Academic에만 적용 할 수있는 작업을 수행하기 전에 사용자가 실제로 직원을 선택했는지 여부를 확인해야하기 때문에 큰 문제입니다.

public Person elementAt(int index) 
{ 
// Returns element at position index 
return list[index]; 
} 

큰 문제가 있습니다. 프로젝트 명세에 따르면 나는 Person, Employee, Academic 또는 Store 클래스를 더 이상 변경할 수 없다. 의미, 어딘지 내 컨트롤러 클래스 내에서 어딘가에 저장소 인덱스의 유형을 결정해야합니다.

더 많은 경험을 가진 사람들이이 프로그램을 실행하고 싶었습니다.

+0

나는 이것을 하드 코드하는 잘못된 방법이라고 생각하며 (암시 적으로 대상이 sth을 수행하는 것을 허용하는 의미가 아니라 사용 권한이 객체에 대해 수행된다는 의미에서) 암시 적으로 생성한다고 생각합니다. 개체에 의해 수행되거나 수행 될 수있는 작업은 사용 권한에 의해 결정되어야합니다. Imho는 처리 할 객체에 대한 메소드 인터셉터 검사 규칙을 훨씬 더 깔끔하게 접근 할 수 있습니다. –

답변

2

의 instance 나에게 당신이 가지고있는 유일한 옵션을 것을; 나는이 경우에 그것을 사용하는 악마라고 생각하지 않는다. O)

적어도 하나의 위치에서 "코드 냄새"를 집중

public boolean isAcademic(Person p) { 
    return p instanceof Academic; 
} 

같은 것을 캡슐화하고, 그것을 만들 수 있습니다,하지만 당신은 객체에 생각에 좋은 일이 아니다, 맞다 나중에 리팩토링하기 쉽습니다.

0

내가 바로 그것을 가지고 있는지 알고,하지만 당신은 단지 반환 된 개체 유형을 확인하려면,이하지 않는다 :

Person person = store.elementAt(0); 
if (person instanceof Academic) { 
    //do stuff 
} 
+0

이 프로그램을 내 프로그램에서 사용했지만 스택 오버플로에서 'instanceof'를 사용하는 것이 싫어서 읽었습니다. 나는 잠재적 인 대안을 찾기 위해 낚시를했지만 어쩔 수없이 도움을 주셔서 감사합니다! – BryanStanley1989

+0

그렇다면 어떻게 받아 들여지는 대답이 똑같은 것을 제안합니까? 하하하 –