我正在使用wicket,构建一个解耦组件。在使用事件驱动机制让组件进行通信时,我在类“GenericComponent”中保留了一个Set。 基本思想是发送一个事件,其中“Someevent.class”作为从IGenericEvent扩展的有效负载。然后在GenericComponent类的onEvent方法中,遍历添加到Set的所有事件。如果类匹配有效负载,则应该执行该事件。
现在有些代码:
GenericComponent
public class GenericComponent<T> extends GenericPanel<T>
{
//...
protected Set<IGenericEvent>eventSet = new HashSet<IGenericEvent>();
//...
public void addEvent(final IGenericEvent event)
{
boolean result = eventSet.add(event);
if (!result)
{
throw new IllegalArgumentException("Event already added ...");
}
}
@Override
public void onEvent(final IEvent<?> event)
{
for (IGenericEvent e : eventSet)
{
if (e.getClass().equals(event.getPayload()))
{
e.action(this.getContainer());
}
}
update();
}
}
IGenericEvent
public interface IGenericEvent
{
public void action(final WebMarkupContainer container);
}
HideEvent
public class Hide implements IGenericEvent, Serializable
{
private static final long serialVersionUID = 1L;
@Override
public void action(WebMarkupContainer container)
{
container.setVisible(false);
}
}
问题:
如果我如前所述定义实现IGenericEvent的onAction事件,那么一切都还可以。
问题是我在页面中自己做的,作为界面的匿名实现。然后,这个类将是PageSomething $ 1,2,3。
errorMessage.add(new Hide()
{
private static final long serialVersionUID = 1L;
@Override
public void onAction(Component component)
{
System.out.println("here");
}
});
我已经尝试过isAsignableFrom和Class.isIntance,但它确实有意义;匿名实现的类是PageSomething。所以isAsignableFrom或isInstance不适用。
我拒绝相信我应该使用一些泛型来获得正在使用的实际类/接口。像
这样的东西 AbstractEvent<Hide>.
我希望你们能理解这个问题。
提前致谢。