2

我正在使用 wicket,构建一组解耦组件。在使用事件驱动机制让组件进行通信时,我在“GenericComponent”类中保留了一个 Set。基本思想是发送一个事件,将“Someevent.class”作为从 IGenericEvent 扩展的有效负载。然后在 GenericComponent 类的 onEvent 方法中,遍历所有添加到 Set 的事件。如果该类与有效负载匹配,则应执行该事件。

现在一些代码:

通用组件

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

}

通用事件

public interface  IGenericEvent
{

    public void action(final WebMarkupContainer container);

}

隐藏事件

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

我希望你们明白这个问题。

提前致谢。

4

0 回答 0