2011-07-18 2 views
0

同様のStackOverflow質問Way to specify multiple interfaces in Javaが直面する問題と同様の問題が発生していますが、具体的にはhttp://code.google.com/webtoolkit/articles/mvp-architecture.htmlで示されているGWT MVPサンプルフレームワークに適用されます。代わりにGWT MVPでHasClickHandlers以外のものを使用

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

:この例では

は、/Contacts/src/com/google/gwt/sample/contacts/client/presenter/ContactsPresenter.javaファイルで、インターフェースの表示は、次のメソッドが含まれていますこれらのボタンのうち、私はここでgetSuggestBox()メソッドを作りたいと思います。私のプレゼンターファイル内のバインド()メソッドでは、私は

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

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

を起動し、これらのハンドラを作成したいと思います。これを行うには

は、私の最初のソリューションは、次のようになりますHasSearchHandlersインターフェイスを作成することでした。

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

をし、その後方法

HasSearchHandlers getSuggestBox() 

これを使用しようとしたが、失敗しましたこれまでのところ。私はどちらかの多型を使用してgetSuggestBoxを(実装するContactsViewファイルの私のバージョンで

private HasSearchHandlers box = new SuggestBox() 

を言う)、と私はHasSearchHandlersにSuggestBoxをキャストすることはできませんすることはできません - 私はClassCastExceptionが取得します。 JREはHasSearchHandlersが空のインターフェイスであることを知っているので、SuggestBoxがこのキャストが機能するためにHasSearchHandlersを明示的に実装する必要はありません。 SuggestBoxクラスは、HasSearchHandlersインターフェイスにあるすべてのものを実装します。これで足りないの?

この記事の最初のリンクで代替として提示されたジェネリックインターフェイスは、同じことを「HasSearchHandlers」と呼ぶことなく同じことをするので、私には同様の難しさを与えました。この問題に照らして、最善の設計ステップは何ですか? GWT MVPフレームワークで「getSuggestBox()のような」メカニズムを実装して作成する方法は?

答えて

0

クラスSuggestBoxは、HasSearchHandlersインターフェイスにあるすべてのものを実装します。これで足りないの?

いいえ、十分な、クラスSuggestBoxは(それは明らかにしない)HasSearchHandlersインタフェース自体を実装する必要がありません。

この問題を考慮して、最適な設計ステップは何ですか?

あなたは2つのことを行うことができます -

1)インタフェースがsuggest boxによって提供されているものは何でも利用(ウルコードを変更します)。

2)提案ボックスを拡張し、ハンドラを実装する独自のウィジェットを作成します。

提案箱の機能をさらに拡張したいとは思わないので、数字1を使用します。

1

あなたは一般的な方法としてgetSuggestBoxを定義することができます。

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

Tが実際にビューインタフェース上の、ではない方法で宣言された状態で)あなたのビューがSuggestBoxを使用して実装します

T。ユニットテストでは、HasSearchHandlersのようなモックを使用します。あなたの発表者は?ジェネリックパラメータを持つビューインターフェイスを使用する必要があります。
(私はこれを書いているよう正直に、私はそれが仕事だろうわからないんだけど、私の主なポイントは以下の通りですので...)

しかし、私はむしろのアプローチ以下のお勧めします"Part II" articleで、ビュー自体がイベントハンドラを添付して、プレゼンタによって実装されたインターフェイスに委譲します。コードを読みやすく保守しやすくします(特に、同じコンポーネントをいくつかのインターフェイスで公開する場合、コードの最も重要な部分があるプレゼンターの匿名ハンドラが少ないため)ビュー内で@UiHandlerを使用してイベントをバインドすることができます(匿名のクラスも少なくなります)。さらに重要なことに、ユニットテストをはるかに簡単にすることができます。 (彼らのメソッドに渡された値を覚えて、返されたHandlerRegistrationなどを模倣するHasXxxHandlersインターフェイスを模擬する必要はなくなりました)

関連する問題