Способ указания нескольких интерфейсов в 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. Это скорее модель делегирования, которая продолжает обрабатывать компоненты пользовательского интерфейса и в отдельных классах, которые вы можете изменить по своему усмотрению.