C'est nécessairement un problème de conception.
L'héritage sert en premier lieu à découper un problème en niveau d'abstraction.
Je reprends ton problème de météo (sans en connaître toute l'étendue, bien sûr).
Imagine que tu aies un premier système basique où soit il fasse soit beau, soit il pleuve.
Un module est chargé de l'affichage de ces évenement météo. Le beau temps est matérialisé par un disque jaune de rayon plus ou moins grand en fonction de la température
attendue, et la pluie par une goutte d'eau plus ou moins haute en fonction du volume de précipitation prévu.
Si je suis ta conception initiale, ce module d'affichage comporte un genre de fonction membre comme ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11
| afficher(...)
{
pour chaque evenement e:
si (e est un 'beau temps')
récupérer la température
afficher un soleil en fonction de cette température
si (e est un 'pluie')
récupérer le volume de précipitation
afficher une goutte en fonction de ce volume
} |
Ce type de conception est problématique. Elle impose que le module d'affichage détermine le type d'évenement à afficher (c'est le problème que tu rencontres). En d'autre termes, ce module ne peut pas manipuler tous les évenements de manière uniforme.
Elle est de ce fait peu évolutive. Si on souhaite dans un deuxième temps ajouter un autre évenement, de type brouillard par exemple, qui sera représenté par un carré hachuré plus ou moins dense en fonction de la visibilité, il faudra modifier le module qui gère l'affichage.
Une solution simple (mais pas unique) est de déléguer la responsabilité de sa représentation à chaque type d'évenement. Le module d'affichage dresse le tableau général, en dessinant une carte de France, plaçant les villes, etc. Et quand vient le moment de placer un signe représentant l'évenement météo, il 'demande' à cet évenement, soit de lui fournir sa représentation graphique, soit de 'se peindre' à un endroit déterminé.
La fonction d'affichage du module devient
Code:
1 2 3 4 5
| afficher(...)
{
pour chaque evenement e
e.afficher();
} |
Dans ce cas, on peut faire jouer les mécanismes dhéritage, et notamment la liaison dynamique. Le module d'affichage ne manipules que des évenements météo, sans savoir s'il s'agit de pluie, soleil ou autre. Chacun de ces évènement particuliers hérite d'une classe mère qui impose de posséder une fonction 'afficher'. Cette fonction est redéfinie dans chaque type d'évènement afin d'y fournir sa représentation graphique spécifique.
Ainsi, le module d'affichage n'a plus besoin de connaître le type réel des évenements qu'il manipule. Du coup, il peut facilement manipuler des listes, vecteurs, tableaux, etc... d'évènements, et l'ajout d'un nouvel évènement (la grêle par exemple) est grandement facilité.