В моем приложении Layer/View есть система диспетчеризации событий, а также доска. В нем слушатели хранятся с помощью хэш-карты с ключами, которые являются типами событий, реализованными как перечисляемый EventType, а значения - это ссылки слушателя, которые прослушивают этот тип события. Например. объект модели прослушивает тип события «LOCAL_PLAYER_INPUT», доски обрабатывают и уведомляют игрока, так как игрок реализует интерфейс EventHandler.Инкапсулированная обработка событий с помощью Enums
Я хотел бы отделить мою модель дальше, выполнив отдельную доску для модели. Затем он будет добавлен в качестве слушателя к доске уровня приложения, поскольку прикладной уровень получает ввод/вывод с клавиатуры или прикосновения. Модельная доску сама делегировала бы события дальше. Для этого я хотел создать перечислимую иерархию, где событие классифицируется таким образом:
MODEL.LOCAL.PLAYER_INPUT
Модель будет зарегистрирована в качестве слушателя в виде доске только пройдя MODEL так:
addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType)
По сочетая интерфейсы с перечислениями, которые я достиг, чтобы я мог писать типы событий, такие как MODEL.XY, но он не будет принят addListener, хотя MODEL реализует интерфейс EventType.
Что мне делать?
EDIT: Еще немного кода
Метод добавления слушателя:
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:
public GameEvent(EventType eventType, Object message) {
this.eventType = eventType;
this.message = message;
timeStamp = System.currentTimeMillis();
}
Поскольку ваши ключи перечислены, вам следует использовать «EnumMap». Хотя я считаю, что на самом деле это не критическая производительность здесь – fge
Это хороший совет, я его реализую, спасибо! –
Некоторый код был бы полезен. Как выглядят ваши перечисления (ы), о чем жалуется компилятор? – lost