2010-11-26 14 views
13

Tengo dos interfaces, HasClickHandlers y DoesFancyFeedback. Luego, tengo algunos objetos UI que implementan ambas interfaces, por ejemplo, un Button que implementa tanto manejadores de clics como retroalimentación.Forma de especificar múltiples interfaces en Java

En mi código que se declara Button s, no quiero decir que en realidad Button porque a lo mejor más adelante voy quiero que sea, no sé, un Image que tiene haga clic manipuladores y hace retroalimentación de fantasía. Así que en lugar de ser específico y diciendo algo como:

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

quiero decir,

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

Quiero que el compilador requiere que aThingIPassedIn implementar tanto HasClickHandlers y DoesFancyFeedback.

Podría crear una interfaz que extienda esas dos interfaces, y usar eso. ¿Hay alguna manera más fácil/menos detallada?

+0

En teoría, se puede hacer esto con genéricos, creo - impone una restricción al argumento de que debe implementar ambas interfaces. Sin embargo, hace mucho tiempo que no uso genéricos Java, por lo que mi memoria podría estar un poco contaminada por los genéricos .NET. – cdhowie

+1

¡Cualquier información específica (hah) sobre cómo lograr esto sería genial! –

Respuesta

26

No creo que haya una mejor manera de hacer lo que quiera. Solo quería sugerirle que haga lo siguiente. Puede crear el método (llamémoslo foo) que acepta el argumento de que requiere 2 interfaces:

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

por favor la atención en un símbolo de unión entre los 2 interfaces.

+0

Whoa, ¿quién sabía? Después de esto, siempre sería seguro lanzar 'arg' a' HasClickHandlers' o 'DoesFancyFeedback', ¿verdad? Esto sería mucho más fácil que crear una interfaz compuesta para cada combinación de interfaces que pueda desear. –

+2

@Riley: No tiene que lanzarlo en este caso, simplemente llame a los métodos que contiene. – thejh

+0

Ah, por supuesto. ¡Esto es genial! –

1

No, no existe tal cosa en Java.

Debería usar la opción que menciona para crear una tercera interfaz. De esa manera declarará explícitamente su intención de usar un nuevo tipo.

No es eso, después de todo prolijo (teniendo en cuenta la alternativa), porque usted acaba de escribir:

public interface FancyWithHandler 
     extends HashClickHandlers , DoesFancyFeedback {} 

No es necesario incluir los métodos. Y luego sólo lo utilizan:

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

Mientras que la opción genérica parece interesante, probablemente, al final va a terminar la creación de una cosa mucho más prolija.

+0

OP dijo: "Podría crear una interfaz que extienda esas dos interfaces, y usar eso. ¿Hay alguna manera más fácil/menos detallada?" – thejh

+0

Extraño esa parte, he cambiado mi respuesta. – OscarRyz

5

Usted puede tratar de usar los genéricos:

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

Una forma excelente de declarar un parámetro: ¿hay alguna manera de declarar un campo u otra variable como esta? –

0

Aunque eso sería feo, que además probablemente podría hacer que un objeto y lanzarlo. Para el método de llamada, sería la forma más fácil.

-1

No me gustaría tener un botón para implementar ninguna de esas interfaces. Lo que estás describiendo suena más como la provincia de un oyente de evento. Es mejor que el oyente implemente manejadores de clics simples y sofisticados, y pase el oyente al componente Botón o UI. Es más un modelo de delegación que sigue procesando fuera de los componentes de UI y en clases separadas que puede cambiar a voluntad.

+0

¿No le gustaría un botón para implementar 'HasClickHandlers'? Esto no está procesando, esta es la interfaz de usuario: 'DoesFancyFeedback' en este caso es" mostrar un ícono de carga giratoria junto al texto del botón ", y' HasClickHandlers' es "dime cuando el usuario haga clic en este botón". Después de todo, ¿qué adjuntaría el oyente que propones sino el botón en sí? –

+1

¿Qué está haciendo HasClickHandlers? ¿Solo un verdadero/falso para indicar si algo está registrado? – duffymo

Cuestiones relacionadas