2010-11-26 22 views
13

J'ai deux interfaces, HasClickHandlers et DoesFancyFeedback. Ensuite, j'ai des objets d'interface utilisateur qui implémentent les deux interfaces - par exemple, un Button qui implémente à la fois des gestionnaires de clic et des retours de fantaisie.Possibilité de spécifier plusieurs interfaces en Java

Dans mon code qui est déclaré Button s, je ne veux pas dire en fait Button parce que peut-être plus tard, je vais veux que ce soit, je ne sais pas, un Image qui a cliquez sur les gestionnaires et fait des commentaires de fantaisie. Ainsi, au lieu d'être précis et dire quelque chose comme:

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

Je veux dire,

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

Je veux que le compilateur d'exiger que aThingIPassedIn mettre en œuvre à la fois HasClickHandlersetDoesFancyFeedback.

Je pourrais créer une interface qui étend ces deux interfaces, et l'utiliser. Y a-t-il un moyen plus facile/moins verbeux?

+0

Vous pouvez théoriquement le faire avec des génériques, je pense - placer une contrainte sur l'argument qu'il doit implémenter les deux interfaces. Cependant, cela fait un moment que j'ai utilisé des génériques Java, donc ma mémoire pourrait être un peu corrompue par les génériques .NET. – cdhowie

+1

Des détails (hah) sur la façon d'accomplir ce serait génial! –

Répondre

26

Je ne pense pas qu'il existe une meilleure façon de faire ce que vous voulez. Je voulais juste vous suggérer de faire ce qui suit. Vous pouvez créer la méthode (appelons-foo) qui accepte l'argument qui nécessite 2 interfaces:

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

S'il vous plaît faites attention sur une esperluette entre 2 vos interfaces.

+0

Whoa, qui savait? Après cela, il serait toujours sûr de lancer 'arg' soit' HasClickHandlers' ou 'DoesFancyFeedback', n'est-ce pas? Ce serait beaucoup plus facile que de créer une interface composite pour toutes les combinaisons d'interfaces que je pourrais souhaiter. –

+2

@Riley: Vous n'avez pas à le lancer dans ce cas, appelez simplement les méthodes dessus. – thejh

+0

Ah, bien sûr. C'est bien! –

1

Non, cela n'existe pas en Java.

Vous devez utiliser l'option que vous avez mentionnée pour créer une troisième interface. De cette façon, vous déclarerez explicitement votre intention d'utiliser un nouveau type.

est-ce pas bavard après tout (en considérant l'alternative), parce que vous suffit de taper:

public interface FancyWithHandler 
     extends HashClickHandlers , DoesFancyFeedback {} 

Vous n'avez pas besoin d'inclure les méthodes. Et puis juste utiliser:

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

Alors que l'option générique semble intéressante, probablement à la fin vous finirez par créer une chose beaucoup plus bavard.

+0

OP dit: "Je pourrais créer une interface qui étend ces deux interfaces, et l'utiliser.Est-il un moyen plus facile/moins verbeux?" – thejh

+0

Cette pièce me manque, j'ai changé ma réponse. – OscarRyz

5

Vous pouvez essayer d'utiliser les médicaments génériques:

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

Une excellente façon de déclarer un paramètre - est-il possible de déclarer un champ ou une autre variable comme celle-ci? –

0

Bien que ce serait laid, vous pouvez faire propably il un objet et de le jeter. Pour la méthode d'appel, ce serait le moyen le plus simple.

-1

Je ne voudrais pas qu'un bouton mette en œuvre l'une de ces interfaces. Ce que vous décrivez ressemble plus à la province d'un auditeur d'événement. Il est préférable que l'écouteur mette en œuvre des gestionnaires de clics simples et fantaisistes et transmette l'écouteur au composant Button ou UI. Il s'agit plutôt d'un modèle de délégation qui conserve le traitement hors des composants de l'interface utilisateur et dans des classes distinctes que vous pouvez modifier à volonté.

+0

Vous ne voulez pas qu'un bouton implémente 'HasClickHandlers'? Ce n'est pas le traitement, c'est l'interface utilisateur - 'DoesFancyFeedback' dans ce cas est" montrer une icône de chargement virevoltant à côté du texte du bouton, "et' HasClickHandlers' est "dites-moi quand l'utilisateur clique sur ce bouton." Après tout, qu'est-ce que l'auditeur que vous proposez attacher si ce n'est le bouton lui-même? –

+1

Que fait HasClickHandlers? Juste un vrai/faux pour indiquer si quelque chose est enregistré? – duffymo