Bonsoir,
Supposons une classe mère abstraite Element disposant d'un certain nombre d'attributs, et dont dérivent les classes concrètes ElementA, ElementB, ElementC, chacune possédant ses attributs propres.
On souhaite représenter dans un JPanel PanelElement les caractéristiques d'un objet sous-type d'Element.
Quelle serait la façon la plus élégante et la plus "orientée objet" de définir la classe PanelElement, et éventuellement ses sous-types ?
Par exemple (toute autre suggestion est la bienvenue...) :
Je précise que Element et ses sous-classes sont de simples business objects (beans) et qu'il n'est pas possible d'enrichir ses classes pour fournir d'autres méthodes que les getter/setter sur les attributs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 abstract class PanelElement extends JPanel { public PanelElement(Element element) { this.element = element; add(new JLabel("Date début")); add(new JLabel(String.valueOf(element.getDateDebut()))); ... } } class PanelElementA extends PanelElement { public PanelElementA(ElementA elementA) { super(elementA); this.elementA = elementA; add(new JLabel("Heure début"); add(new JLabel(String.valueOf(elementA.getHeureDebut()))); ... } }
Le problème est le suivant : je dispose d'une collection d'objets de type ElementA, ElementB, ...
Comment instancier le panel correspondant en évitant des appels à instanceof ?
Si on est amené à créer un nouveau type ElementD, il faut prévoir son panel correspondant PanelElementD. Il est pénible d'avoir à rechercher dans le code les occurrences de instanceof ElementX pour compléter avec le nouveau type partout où c'est nécessaire...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if (element instanceof ElementA) { return new PanelElementA((ElementA) element); } else if (element instanceof ElementB) { ... }
D'où la question : y a-t-il un design pattern ou des techniques OO permettant de s'affranchir tout ou partie de faire de la reconnaissance de type à l'exécution ?
Partager