Использование чего-то другого, чем HasClickHandlers, в моем GWT MVP - PullRequest
0 голосов
/ 18 июля 2011

Я столкнулся с проблемой, аналогичной проблеме, с которой сталкивался аналогичный вопрос 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?

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Вы можете определить getSuggestBox как универсальный метод:

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

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

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

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

0 голосов
/ 18 июля 2011

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

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

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

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

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

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

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

...