2013-06-17 12 views
5

Moja aplikacja Layer/View ma system wysyłania zdarzeń, czyli tablica. W nim detektory są przechowywane przez tablicę kontrolną z kluczami będącymi typami zdarzeń zaimplementowanymi jako enum EventType i wartości będące odsłuchiwaniem odsłuchiwania tego typu zdarzenia. Na przykład. obiekt modelu słucha zdarzenia typu "LOCAL_PLAYER_INPUT", przetwarza tablicę i powiadamia gracza, ponieważ odtwarzacz implementuje interfejs EventHandler.Hermetyzacja zdarzeń z Enums

Chciałbym oddzielić mój model poprzez wprowadzenie samodzielnej tablicy dla modelu. Następnie zostanie dodany jako słuchacz do tablicy warstw aplikacji, ponieważ warstwa aplikacji pobiera dane z klawiatury lub dotyku. Tablica modeli sama delegowałaby wydarzenia dalej. W tym chciałem stworzyć hierarchię enum w którym zdarzenie jest podzielone w ten sposób:

MODEL.LOCAL.PLAYER_INPUT 

model byłby zarejestrowany jako słuchacza w widoku tablicy tylko przekazując MODEL tak:

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

By łącząc interfejsy z wyliczeniami, które osiągnąłem, że mogę pisać typy zdarzeń takie jak MODEL.XY, ale nie będą akceptowane przez addListener, chociaż MODEL implementuje interfejs EventType.

Co należy zrobić?

EDIT: Niektóre bardziej Kod

addListener metoda:

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; 
    } 

} 

wyliczenia:

public interface WL extends EventType { 

public static enum LOCAL { 
    PLAYER_INPUT, 
    NPC_INPUT 
} 

}

GameEvent:

public GameEvent(EventType eventType, Object message) { 
    this.eventType = eventType; 
    this.message = message; 
    timeStamp = System.currentTimeMillis(); 

} 
+0

Ponieważ twoje klucze są wyliczone, powinieneś rozważyć użycie 'EnumMap'. Chociaż uważam, że to naprawdę nie jest krytyczne pod względem wydajności tutaj – fge

+0

To dobra wskazówka, zaimplementuję ją, dzięki! –

+0

Przydałoby się trochę więcej kodu. Jak wyglądają twoje wyliczenia, na co narzeka kompilator? – lost

Odpowiedz

0

MODEL.LOCAL.PLAYER_INPUT nie jest typu EventType, mimo że jest MODEL. Ponieważ enum jest wewnętrzną klasą MODEL, jego typ jest w rzeczywistości 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 
    } 
} 

mógł go zmienić na:

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 
    } 
} 

jest problem, jeśli teraz odnieść się do WL.LOCAL, to typ byłoby Class (nie 100% pewny o tym jednym, ale to nie jest deffinetly EventType. Może nawet nie skompilować się właściwie). Będziesz musiał zadeklarować LOCAL jako stałą wyliczeniową, aby uzyskać do niej dostęp w ten sposób. Niestety nie ma sposobu, aby to zrobić, jeśli obie powinny mieć to samo imię.

Jeśli czegoś nie brakuje, trzeba znaleźć zupełnie inne rozwiązanie. Być może nie była to odpowiedź, której szukałeś, ale była zbyt długa, by ją skomentować.

+0

Dzięki za odpowiedź. Idę teraz w ten sposób: Ponieważ enum WL (to skrót od WorldLogic, to nazwa dla mojego modelu) jest typu WL, mogę wykonać test getClass() i wszystko jest w porządku. Dodaj przeciążoną metodę addListener do mojej tablicy, która dodaje słuchaczy szukających specjalnej klasy i to wszystko. –

Powiązane problemy