Использование чего-то другого, кроме HasClickHandlers, в моем MVP GWT

Я столкнулся с проблемой, аналогичной проблеме, с которой столкнулся аналогичный вопрос StackOverflow Способ указать несколько интерфейсов в Java, но поскольку это конкретно относится к платформе примера GWT MVP, представленной в http://code.google.com/webtoolkit/articles/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 (). В методе bind () в моем файле Presenter я хотел бы вызвать

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». В свете этой проблемы, что лучше всего сделать при проектировании? Как мне реализовать и создать механизм, подобный getSuggestBox (), в структуре GWT MVP?


person Coder    schedule 18.07.2011    source источник


Ответы (2)


Класс SuggestBox реализует все, что присутствует в интерфейсе HasSearchHandlers; этого недостаточно?

Нет, недостаточно, класс SuggestBox должен реализовывать сам интерфейс HasSearchHandlers (чего, очевидно, нет).

В свете этой проблемы, что лучше всего сделать при проектировании?

Вы можете сделать две вещи -

1) Используйте (измените код ur) любые интерфейсы, предоставляемые поле предложения.

2) Создайте свой собственный виджет, который расширяет поле предложений и реализует ваши обработчики.

Я бы выбрал номер 1, так как я не верю, что вы хотите дальше расширять функциональность ящиков для предложений.

person Jai    schedule 18.07.2011

Вы можете определить getSuggestBox как общий метод:

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

(причем T фактически объявлен в интерфейсе просмотра, а не в методе)

Что ваше представление будет реализовывать с использованием SuggestBox для T. Вместо этого в модульных тестах можно использовать макет, например HasSearchHandlers. Вашему докладчику придется использовать интерфейс просмотра с общим параметром ?.
(честно говоря, пока я пишу это, я не уверен, что это сработает, но моя основная мысль ниже, так что ...)

Но я бы предпочел следовать подходу, описанному в статье "Часть II", где само представление присоединяет обработчики событий и делегирует их интерфейсу, реализованному ведущим. Это упрощает чтение и сопровождение кода (особенно в тех случаях, когда вы хотите предоставить один и тот же компонент через несколько интерфейсов, но также потому, что у вас меньше анонимных обработчиков в вашем презентаторе, где находится самая важная часть вашего кода), делает можно использовать @UiHandler в представлении для привязки событий (даже меньше анонимных классов) и, что, возможно, даже более важно, значительно упрощает модульное тестирование! (вам больше не нужно имитировать HasXxxHandlers интерфейс, который запоминает значения, переданные их методам, и имитирует возвращаемые HandlerRegistration и т. д.)

person Thomas Broyer    schedule 18.07.2011