- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在重构大量使用 case 语句和 emum 的现有状态机。我将其分解为事件和事件处理程序对象,每个对象对应一个状态机。事件处理程序返回新事件以通过状态机传播。
所以,我的代码看起来像这样:
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
完成此运行时事件"dispatch"的最佳方法是什么?
最佳答案
你是对的,重载方法将无法解决这个问题(因为要调用的方法是在编译时确定的)。
我建议您需要重构它,或者向 event
添加一个方法,将处理程序作为参数(类似于 public void act(EventHandler handler)
),或者重写您的处理程序,使其不需要非常清楚事件的类型。如果 Event
是一个合理的接口(interface)/父类(super class),它本身就会公开足够的功能,这样 EventHandler 就不需要知道特定类型。
当然,如果确实需要,您可以始终进行强制转换,但一般来说,您应该遵循 Demeter 法则,并且仅通过 Event 接口(interface)与事件对象进行交互。
关于java - 如何将类的子类型的实例传递给相应的重载方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3159918/
我在 Java 中遇到异常处理问题,这是我的代码。当我尝试运行此行时出现编译器错误:throw new MojException("Bledne dane");。错误是: exception MojE
我刚刚开始学习asp.net。在你们的支持下,我希望我能从这个论坛学到更多东西。 我的问题是, 我在 asp.net 页面中有一个 TabContainer1,因为每个选项卡面板中有多个类似 (60)
我是一名优秀的程序员,十分优秀!