Способ указать несколько интерфейсов в Java - PullRequest
13 голосов
/ 27 ноября 2010

У меня два интерфейса, HasClickHandlers и DoesFancyFeedback.Затем у меня есть несколько объектов пользовательского интерфейса, которые реализуют оба интерфейса - например, Button, который реализует оба, имеет обработчики кликов, а также имеет причудливую обратную связь.

В моем коде, который объявляет Button s, я нена самом деле я хочу сказать Button, потому что, может быть, позже я захочу, чтобы он был, я не знаю, Image, который имеет обработчики щелчков и делает фантастическую обратную связь.Поэтому вместо того, чтобы быть конкретным и говорить что-то вроде:

Button saveButton = aButtonIPassedIn;
saveButton.addClickHandler();
saveButton.doFancyFeedback();

Я хочу сказать,

{HasClickHandlers + DoesFancyFeedback} clickyFeedbackThing = aThingIPassedIn;
clickyFeedbackThing.addClickHandler();
clickyFeedbackThing.doFancyFeedback();

Я хочу, чтобы компилятор потребовал, чтобы aThingIPassedIn реализовал оба HasClickHandlers и DoesFancyFeedback.

Я мог бы создать интерфейс, расширяющий эти два интерфейса , и использовать его.Есть ли более простой / менее многословный способ?

Ответы [ 5 ]

27 голосов
/ 27 ноября 2010

Я не думаю, что есть лучший способ сделать то, что вы хотите. Я просто хотел предложить вам сделать следующее. Вы можете создать метод (назовем его foo), который принимает аргумент, который требует 2 интерфейса:

<T extends HasClickHandlers & DoesFancyFeedback> void foo(T arg);

Обратите внимание на один амперсанд между двумя вашими интерфейсами.

5 голосов
/ 27 ноября 2010

Вы можете попробовать использовать дженерики:

public < T extends HashClickHandlers & DoesFancyFeedback > void foo (
        T aThingIPassedIn
    )
{
    aThingIPassedIn.addClickHandler( );
    aThingIPassedIn.doFancyFeedback( );
}
1 голос
/ 27 ноября 2010

Нет, такого нет в Java.

Вы должны будете использовать упомянутую вами опцию создания третьего интерфейса. Таким образом, вы будете явно заявлять о своем намерении использовать новый тип.

Разве это не так многословно (учитывая альтернативу), потому что вы просто наберете:

public interface FancyWithHandler 
       extends HashClickHandlers , DoesFancyFeedback {} 

Вам не нужно включать методы. А потом просто используйте это:

FancyWithHandler clickyFeedbackThing = aThingIPassedIn;
clickyFeedbackThing.addClickHandler();
clickyFeedbackThing.doFancyFeedback();     

Хотя универсальный вариант выглядит интересным, возможно, в конце вы создадите более многословную вещь.

0 голосов
/ 27 ноября 2010

Я бы не хотел, чтобы Button реализовывал любой из этих интерфейсов. То, что вы описываете, больше похоже на провинцию слушателя событий. Лучше, чтобы слушатель реализовал простые и причудливые обработчики щелчков и передавал слушателя в компонент Button или UI. Это скорее модель делегирования, которая позволяет обрабатывать компоненты пользовательского интерфейса и отдельные классы, которые вы можете изменить по своему усмотрению.

0 голосов
/ 27 ноября 2010

Хотя это было бы ужасно, вы могли бы сделать его Объектом и разыграть его. Для вызывающего метода это будет самый простой способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...