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...) :
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())));
    ...
  }
}
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.
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 ?
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) {
  ...
}
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...
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 ?