我有两个界面,HasClickHandlers
和DoesFancyFeedback
。然后我有一些实现两个接口的UI对象 - 例如,实现它们的Button
都有点击处理程序,并且也做了很好的反馈。
在我宣布Button
的代码中,我不想实际说Button
,因为也许以后我会希望它是,我不知道,Image
点击处理程序并做出花哨的反馈。所以不是具体而是说:
Button saveButton = aButtonIPassedIn;
saveButton.addClickHandler();
saveButton.doFancyFeedback();
我想说,
{HasClickHandlers + DoesFancyFeedback} clickyFeedbackThing = aThingIPassedIn;
clickyFeedbackThing.addClickHandler();
clickyFeedbackThing.doFancyFeedback();
我希望编译器要求aThingIPassedIn
同时实现HasClickHandlers
和 DoesFancyFeedback
。
我可以创建一个扩展这两个接口的接口,然后使用它。有没有更简单/更简洁的方式?
答案 0 :(得分:27)
我认为没有更好的方法来做你想做的事。 我只是想建议你做以下事情。您可以创建接受需要2个接口的参数的方法(让我们称之为foo):
<T extends HasClickHandlers & DoesFancyFeedback> void foo(T arg);
请注意2个接口之间的一个&符号。
答案 1 :(得分:5)
您可以尝试使用泛型:
public < T extends HashClickHandlers & DoesFancyFeedback > void foo (
T aThingIPassedIn
)
{
aThingIPassedIn.addClickHandler( );
aThingIPassedIn.doFancyFeedback( );
}
答案 2 :(得分:1)
不,Java中没有这样的东西。
您必须使用您提到的创建第三个界面的选项。这样你就可以明确宣布你打算使用新类型。
毕竟不是那么冗长(考虑替代方案),因为你只需输入:
public interface FancyWithHandler
extends HashClickHandlers , DoesFancyFeedback {}
您不需要包含这些方法。然后使用它:
FancyWithHandler clickyFeedbackThing = aThingIPassedIn;
clickyFeedbackThing.addClickHandler();
clickyFeedbackThing.doFancyFeedback();
虽然通用选项看起来很有趣,但最终你可能最终会创建一个更加冗长的东西。
答案 3 :(得分:1)
不需要第三个接口,也不需要其他方法。
Optional.ofNullable((HasClickHandlers & DoesFancyFeedback)clickyFeedbackThing).ifPresent(then -> {
then.addClickHandler();
then.doFancyFeedback();
});
答案 4 :(得分:0)
虽然那会很难看,但你可以把它变成一个对象然后施展它。对于调用方法,这将是最简单的方法。
答案 5 :(得分:-1)
我不希望Button实现任何这些接口。您所描述的内容听起来更像是事件监听器的范畴。最好让监听器实现简单和奇特的点击处理程序,并将监听器传递给Button或UI组件。它更像是一个委托模型,它可以处理UI组件以及可以随意更改的单独类。