2010-12-29 5 views
5

C# 및 C++의 일부 프로젝트 이후에 Java로 작업하기 시작했습니다. 방문자 구현을위한 유형 삭제 문제를 극복하는 방법

나는이 같은 방문자 인터페이스를 설계하고 싶었 :

public interface ActionVisitor<A> { 
    void visitAction(A action);  
} 

public interface MySmallActionVisitor 
extends ActionVisitor<ActionA>, 
    ActionVisitor<ActionB> 
{ 

} 

public interface MyFullActionVisitor 
extends ActionVisitor<ActionA>, 
    ActionVisitor<ActionB>,ActionVisitor<ActionC>,ActionVisitor<ActionD> //.... 
{ 

} 

물론이 때문에 형의 삭제 작동하지 않습니다. (나는 이런 식으로 뭔가를 원하는 이유는 내가 방문 할 수있는 작업의 다른 그룹에 대해 서로 다른 방문자 인터페이스를 가질 것입니다.) 내 마음에 오는 유일한 해결책

는 인터페이스

public interface ActionAVisitor { 
     void visitAction(ActionA action);  
    } 
public interface ActionBVisitor { 
     void visitAction(ActionB action);  
    } 
//... 
을 선언하는 것입니다

다음

public interface MySmallActionVisitor 
extends ActionAVisitor, ActionBVisitor 
{ 

} 

이 작동 것입니다,하지만 난 바보 반복 및 파일 많이있는 모든 ActionXVisitor - 인터페이스의 선언을 좋아하지 않을 ...

더 나은 방법에 대한 아이디어가 있습니까?

고맙습니다.

답변

2

내가 광범위하게 아주 깨끗하고 깔끔한 방법으로 방문자 패턴을 사용하여 자바에서 크고 복잡한 라이브러리와 함께 작동합니다. 특히, 타입 삭제의 동일한 문제로 우연히 만났고, 이제 해결되었습니다.

기회가 있으면 an article I've written about this을보십시오.

방문객 패턴이 개념적으로 무엇인지 자세히 설명하는 긴 기사이며 기사 마지막 부분에서 다형성 및 유형 삭제와 관련된 실제 사례에 대해 설명합니다.

건배

0

하나의 매개 변수가없는 방문자 인터페이스를 사용하고 방문자 메서드 내에서 유형을 기반으로 한 디스패치를 ​​수행합니다.

+0

"instanceof"를 사용 하시겠습니까? 이것이 방문자 패턴이 피하고 싶어하는 것입니다. 또한, 모든 방문자 (MySmallVisitor, MyFullVisitor 및 기타)의 블록 인 경우이 코드를 작성해야합니다. – Philipp

+0

예, 저는 instanceof를 의미했습니다. 이를 피하려고하면 결국 더 많은 코드로 이어질 것입니다. –

+0

실제로 문제를 극복 할 수있는 방법이 없다면 instanceof 코드보다 코드가 더 많을 것입니다 ... 불쌍한 언어 :-( – Philipp

-2

메소드 내부의 인스턴스를 피할 수있는 방법이 없습니다. 하지만 당신은 더 우아 할 수 있습니다 :

public interface MarkerInterface{} 

public interface ActionVisitor<T extends MarkerInterface> { 
void visitAction(T action);} 

public class A implements MarkerInterface{} 

public class B implements MarkerInterface{} 

public class MySmallActionVisitor implements ActionVisitor<MarkerInterface>{ 

@Override 
public void visitAction(MarkerInterface action) { 
    if(action instanceof A){ 

    } 
    else if(action instanceof B){ 

    } 
} 

}

+0

죄송 합니다만, 방문자 패턴에 대해 들어 본 적이 있습니까? 물론 피할 수 있습니다. http://en.wikipedia.org/wiki/Visitor_pattern#Java_example – Philipp

+0

다행 내가 새로운 것을 배웠다. – LazyCubicleMonkey

관련 문제