Способ указания нескольких интерфейсов в Java

У меня есть два интерфейса: 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.

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

public < T extends HashClickHandlers & DoesFancyFeedback > void foo (
        T aThingIPassedIn
    )
{
    aThingIPassedIn.addClickHandler( );
    aThingIPassedIn.doFancyFeedback( );
}

Ответ 3

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

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

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

public interface FancyWithHandler 
       extends HashClickHandlers , DoesFancyFeedback {} 

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

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

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

Ответ 4

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

Ответ 5

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