2013-06-17 2 views
5

내 응용 프로그램 계층 /보기에는 칠판이라는 이벤트 디스패치 시스템이 있습니다. 여기에는 리스너가 열거 형 EventType으로 구현 된 이벤트 유형 인 키와 해시 맵에 의해 저장되며이 값은이 이벤트 유형을 수신하는 수신기 참조입니다. 예 : 모델 객체는 "LOCAL_PLAYER_INPUT"이벤트 유형을 청취하고 있으며, 칠판은 플레이어가 EventHandler 인터페이스를 구현했기 때문에 처리하고 플레이어에게 알립니다.Enum을 사용한 캡슐화 된 이벤트 처리

모델 용 독립형 칠판을 구현하여 모델을 더욱 분리하고 싶습니다. 그런 다음 응용 프로그램 계층이 키보드 나 터치로 I/O를 가져 오므로 응용 프로그램 계층 칠판에 청취자로 추가됩니다. 모델 칠판 자체가 이벤트를 더 위임합니다.

addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType) 

기준 : 만 같은 모델을 전달하여

MODEL.LOCAL.PLAYER_INPUT 

모델은 뷰 칠판에 리스너로 등록 될 것이다 :이를 위해 나는 이벤트가 이러한 방식으로 분류되는 열거 hierachy를 만들고 싶었 내가 만든 enum과 인터페이스를 결합하여 MODEL.XY와 같은 이벤트 유형을 작성할 수 있지만 MODEL이 EventType 인터페이스를 구현하고 있지만 addListener에 의해 허용되지 않습니다.

어떻게해야합니까?

편집 : 좀 더 코드

의 addListener 방법 :

public void addListener(EventHandler handler, EventType eventType) { 
    getListener(eventType).add(handler);} 


private Array<EventHandler> getListener(EventType eventType) { 
    if(map.containsKey(eventType)) 
     return map.get(eventType); 
    else { 
     Array<EventHandler> tmp = new Array<EventHandler>(false, 1, EventHandler.class); 
     map.put(eventType, tmp); 
     return tmp; 
    } 

} 

열거 형 :

public interface WL extends EventType { 

public static enum LOCAL { 
    PLAYER_INPUT, 
    NPC_INPUT 
} 

}

GameEvent :

+0

키가 열거 형이므로 EnumMap 사용을 고려해야합니다. 비록 이것이 여기에서 실제로 중요한 성능이라고는 생각하지 않지만 – fge

+0

그것은 좋은 팁입니다. 저는 그것을 구현할 것입니다, 감사합니다! –

+0

더 많은 코드가 도움이 될 것입니다. enum (s)은 어떻게 생겼는지, 컴파일러는 무엇에 대해 불평합니까? – lost

답변

0

MODEL.LOCAL.PLAYER_INPUTMODEL이더라도 EventType이 아닙니다. 열거 형은 MODEL의 내부 클래스이기 때문에 유형은 실제로 LOCAL입니다.

public interface WL extends EventType { // Your interface WL is EventType 

    public static enum LOCAL { // Your enum is type LOCAL because there are no extensions 
     PLAYER_INPUT, 
     NPC_INPUT // Your enum constants represents something of type LOCAL 
    } 
} 

당신은 그것으로 변경할 수 있습니다 :

public enum WL implements EventType { // Your interface WL is EventType 

    public static enum LOCAL implements EventType { // LOCAL is now EventType 
     PLAYER_INPUT, 
     NPC_INPUT // So are the enum constants 
    } 
} 

지금 WL.LOCAL를 참조하는 경우 문제는,이다이 유형의 하나에 대한 Class (100 % 확신 할 것입니다하지만 deffinetly EventType 아니다. 중요하게 컴파일하지 못할 수도 있습니다.) 그런 식으로 액세스하려면 열거 형 상수로 LOCAL을 선언해야합니다. 슬프게도 둘 다 동일한 이름을 가져야하는 경우이 작업을 수행 할 수있는 방법이 없습니다.

내가 뭔가를 놓치지 않는다면 완전히 다른 해결책을 찾아야 할 것입니다. 찾고있는 대답이 아닐 수도 있지만 댓글을 달기엔 너무 길었습니다.

+0

답변 해 주셔서 감사합니다. 지금이 방법을 사용할 것입니다 : enum WL (WorldLogic의 약자로, 내 모델의 이름입니다) 유형 WL입니다. getClass() 확인 및 everythings를 할 수 있습니다. 오버랩 된 addListener 메서드를 칠판에 추가하여 특정 클래스를 찾는 청취자를 추가하면됩니다. –