Я рефакторинг существующего государственного аппарата, который сильно использовал аргументы case и emums. Я разбил его на объекты событий и событий, каждый из которых соответствует конечной машине. EventHandlers возвращают новые события для распространения через конечный автомат.Как передать экземпляр подтипа класса соответствующему перегруженному методу?
Итак, мой код выглядит примерно так:
public class Event {
//common fields and methods
}
public class SpecificEvent extends Event {
//fields specific to this event
}
public class AnotherEvent extends Event {
//fields specific to this event
}
public class EventHandler {
public Event handleEvent(SpecificEvent evt) {
//do default something
}
public Event handleEvent(AnotherEvent evt) {
//do default something else
}
}
public class StateOneEventHandler extends EventHandler {
public Event handleEvent(SpecificEvent evt) {
//do State1 things
}
public Event handleEvent(AnotherEvent evt) {
//do other State1 things
}
}
public class StateTwoEventHandler extends EventHandler {
public Event handleEvent(SpecificEvent evt) {
//do State2 things
}
public Event handleEvent(AnotherEvent evt) {
//do other State2 things
}
}
Моя проблема и вопрос: я лишь вскользь общие ссылки событий вокруг в моей государственной машине, так как я могу назвать правильный обработчик мероприятие?
Event evt = new SpecificEvent();
EventHandler handler = new StateOneEventHandler();
//... later
handler.handleEvent(evt); //compiler error
Каков наилучший способ выполнения этого мероприятия «отправка»?
Мне нравится добавлять метод act() к событию. Моя цель заключалась в том, чтобы уменьшить код шаблона, но я предпочел бы разместить его в более или менее фиксированном количестве событий (около 15 пока), чем в каждом обработчике событий (около 60 пока). Благодаря! – Mark