0

我面临着与类似 StackOverflow 问题所面临的问题类似的问题Way to specify multiple interfaces in Java但它特别适用于http://code.google.com/webtoolkit/articles/mvp中提供的 GWT MVP 示例框架-architecture.html

在本例中,在 /Contacts/src/com/google/gwt/sample/contacts/client/presenter/ContactsPresenter.java 文件中,界面 Display 包含以下方法:

public interface Display 
    {
        HasClickHandlers getAddButton();
        HasClickHandlers getDeleteButton();
        HasClickHandlers getList();
        ...
    }

我想在这里创建一个 getSuggestBox() 方法,而不是这些按钮。在我的 Presenter 文件的 bind() 方法中,我想调用

getSuggestBox().addKeyDownHandler({...}) 

getSuggestBox().addSelectionHandler({...}) 

并为这些创建处理程序。

为此,我的第一个解决方案是创建一个 HasSearchHandlers 接口,如下所示:

public interface HasSearchHandlers extends HasKeyDownHandlers,     
HasSelectionHandlers<SuggestOracle.Suggestion>{}

然后尝试使用该方法

HasSearchHandlers getSuggestBox()

然而,到目前为止,这一切都失败了。我不能使用多态性说

private HasSearchHandlers box = new SuggestBox()

在我的 ContactsView 文件版本中实现 getSuggestBox(),我也无法将 SuggestBox 转换为 HasSearchHandlers——我得到了 ClassCastException。JRE 知道 HasSearchHandlers 是一个空接口,所以我不明白为什么 SuggestBox 必须显式实现 HasSearchHandlers 才能使这种转换工作。类 SuggestBox 实现了 HasSearchHandlers 接口中的所有内容;这还不够吗?

在这篇文章的第一个链接中作为替代方案提供的通用接口给我带来了类似的困难,因为它做了同样的事情而不称它为“HasSearchHandlers”。鉴于这个问题,最好的设计步骤是什么?我应该如何在 GWT MVP 框架中实现和创建“getSuggestBox()-like”机制?

4

2 回答 2

1

您可以定义getSuggestBox为通用方法:

<T extends HasKeyDownHandlers, HasSelectionHandlers<SuggestOracle.Suggestion>> T getSuggestBox();

T实际上是在视图界面上声明的,而不是在方法上)

您的视图将SuggestBox使用T. 您的单元测试将改为使用模拟,例如您的HasSearchHandlers. 您的演示者必须使用带有?通用参数的视图界面。
(老实说,当我在写这篇文章时,我不确定它是否有效,但我的主要观点如下,所以......)

但是,我宁愿建议遵循“第二部分”文章的方法,其中视图本身附加事件处理程序并将它们委托给演示者实现的接口。它使代码更易于阅读和维护(特别是在您希望通过多个接口公开相同组件的情况下,而且还因为您的演示者中的匿名处理程序较少,代码中最重要的部分就在其中),使得可以@UiHandler在视图中使用来绑定事件(甚至更少的匿名类),甚至更重要的是使单元测试更容易!(您不再需要模拟HasXxxHandlers记住传递给其方法的值的接口,并模拟返回HandlerRegistration的 s 等)

于 2011-07-18T21:37:20.000 回答
0

类 SuggestBox 实现了 HasSearchHandlers 接口中的所有内容;这还不够吗?

不,还不够,类 SuggestBox 必须实现HasSearchHandlers接口本身(它显然没有)。

鉴于这个问题,最好的设计步骤是什么?

你可以做两件事——

1)使用(修改您的代码)建议框提供的任何接口。

2)创建您自己的小部件,扩展建议框并实现您的处理程序。

我会选择 1 号,因为我认为您不想进一步扩展建议框功能。

于 2011-07-18T18:05:53.050 回答