2009-08-24 11 views
4

Pouvez-vous créer une interface qui ne peut être appliquée qu'à certaines classes et sous-classes?interface pour seulement certaines classes?

Si mon interface est uniquement ajouté à différentes sous-classes de JComponent, et je dois faire référence à la fois les méthodes de JComponent et mon interface ... comment dois-je faire? En haut de ma tête, je peux accomplir cela en ajoutant des méthodes de JComponent à mon interface.

Cela semble maladroit. Quelle est la meilleure façon de faire cela?

+0

Le problème est que votre interface a les mêmes noms de méthode que JComponent, et qu'il y aura un conflit? – Marius

Répondre

6

La solution évidente est d'ajouter une méthode à votre interface qui retourne le composant (qui peut être this).

JComponent getComponent(); 

Ou même genericise votre interface:

public interface MyInterface<C extends JComponent> { 
    C getComponent(); 
    [...] 
} 

Ce n'est pas grand dessein, mais il devrait fonctionner.

2

Il pourrait y avoir des scénarios où cela ne fonctionnera pas, mais en utilisant des génériques vous permet de spécifier plusieurs types:

interface Foo { void frobulize(); } 

class Bar { 
    <T extends JComponent & Foo> String doFoo(T obj){ 
     obj.frobulize(); 
     return obj.getToolTipText(); 
    } 
} 

Si vous voulez que les objets comme des champs sur un type non paramétré, vous ajoutez des paramètres de type à le constructeur (une fonctionnalité peu connue qui est liée à la confusion et impressionner vos collègues):

class Quux { 
    private final Foo foo; 
    private final JComponent component; 
    public <T extends JComponent & Foo> Quux(T fc){ 
     foo = fc; 
     component = fc; 
    } 
} 
-1

Pourquoi le feriez-vous?

Interfaces par leur nature même ne devrait pas être restreint de cette façon et avoir à faire ainsi, est pour moi, indiquant que votre conception est au moins vous êtes plus compliqué ou pire imparfait d'une certaine manière.

Je pense que tant que l'interface est clairement nommée et capture un seul concept, alors il a servi son objectif.

+0

Je reconnais que c'est _many_ ans plus tard, mais je peux penser à quelques raisons pour lesquelles quelqu'un voudra peut-être le faire, et ne pense pas que nous devrions supposer que poser des questions sur l'idée indique un design défectueux –