2011-07-18 28 views
0

我面臨類似的問題,類似的StackOverflow問題Way to specify multiple interfaces in Java所面臨的問題,但它特別適用於http://code.google.com/webtoolkit/articles/mvp-architecture.html中提供的GWT MVP示例框架。在我的GWT MVP中使用除HasClickHandlers之外的東西

在這個例子中,在文件/Contacts/src/com/google/gwt/sample/contacts/client/presenter/ContactsPresenter.java,接口顯示包含下列方法:

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

相反這些按鈕中,我想在這裏做一個getSuggestBox()方法。在我的演示文件中的bind()方法,我想援引

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

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

,併爲這些處理程序。

要做到這一點,我的第一個解決方案是創建一個HasSearchHandlers接口,看起來像這樣:

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

,然後嘗試使用方法

HasSearchHandlers getSuggestBox() 

然而,這已失敗至今。我不能在我的版本的ContactsView文件的使用多態,說

private HasSearchHandlers box = new SuggestBox() 

實施getSuggestBox(),我不能投了SuggestBox成HasSearchHandlers要麼 - 我得到一個ClassCastException。 JRE知道HasSearchHandlers是一個空的接口,所以我不明白爲什麼SuggestBox必須顯式實現HasSearchHandlers才能使這個工程生效。 SuggestBox類實現了HasSearchHandlers接口中的所有內容;這不夠嗎?

在這篇文章的第一個鏈接中作爲替代方案呈現的通用接口給了我類似的難度,因爲它沒有將其稱爲「HasSearchHandlers」而做了同樣的事情。鑑於這個問題,最好的設計步驟是什麼?我應該如何在GWT MVP框架中實現並創建一個「getSuggestBox() - like」機制?

回答

0

SuggestBox類實現了HasSearchHandlers接口中的所有內容;這不夠嗎?

不,還不夠,類SuggestBox必須實現HasSearchHandlers接口本身(這顯然並非如此)。

在這個問題上的光,什麼是最好的設計步驟走?

你可以做兩兩件事 -

1)使用(修改我們的代碼),無論是由suggest box提供的接口。

2)創建您自己的小部件,它擴展了提示框並實現您的處理程序。

我會去1號,因爲我不相信你想擴展建議箱功能的任何進一步。

1

您可以定義getSuggestBox作爲一種通用的方法:

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

(與T實際正在視圖界面,​​而不是在方法上聲明)哪個視圖將實現使用SuggestBoxT。你的單元測試會使用模擬,比如你的HasSearchHandlers。您的演示者必須使用具有?通用參數的視圖界面。
(說實話,正如我在寫這篇文章,我不確定它會工作,但我的主要觀點在下面,所以...)

但是,我寧願推薦以下方法"Part II" article,其中視圖本身附加事件處理程序並將它們委託給由演示者實現的接口。它使得代碼更易於閱讀和維護(特別是在通過多個接口公開相同組件的情況下(特別是在您的代碼中,您的代碼中最重要的部分存在的匿名處理程序較少)的情況下,有可能在視圖中使用@UiHandler來綁定事件(甚至更少的匿名類),甚至可能更重要的是使單元測試更容易! (你不再需要模擬HasXxxHandlers界面,記住傳遞給他們方法的值,並且模擬返回的HandlerRegistration等)

相關問題