Lorsque vous utilisez le concept de polymorphisme, vous créez une hiérarchie de classes et en utilisant la référence des parents, vous appelez les fonctions d'interface sans savoir quel type spécifique a l'objet. C'est bien. Exemple:
Vous avez une collection d'animaux et vous faites appel à la fonction de tous les animaux eat
et peu vous importe si c'est un chien qui mange ou un chat. Mais dans la même hiérarchie de classes, vous avez des animaux qui en ont d'autres - autres que ceux hérités et implémentés de la classe Animal
, par exemple makeEggs
, getBackFromTheFreezedState
etc. Donc, dans certains cas, dans votre fonction, vous voudrez peut-être connaître le type spécifique pour appeler des comportements supplémentaires.
Par exemple, au cas où il est l'heure du matin et si ce n'est qu'un animal, alors vous appelez eat
, sinon si c'est un humain, alors appelez d'abord washHands
, getDressed
et ensuite seulement appelez eat
. Comment gérer ces cas? Le polymorphisme meurt. Vous devez trouver le type d'objet, qui ressemble à une odeur de code. Existe-t-il une approche commune pour gérer ces cas?
Eater
interface avec la eat()
méthode, alors en tant que client, vous ne vous souciez pas qu'une Human
implémentation qu'elle doive d'abord appeler washHands()
et getDressed()
, c'est un détail d'implémentation de cette classe. Si, en tant que client, vous vous souciez de ce fait, vous n'utilisez probablement pas le bon outil pour le travail.
getDressed
avant eat
, ce n'est pas le cas pour le déjeuner. Selon votre situation, cela washHands();if !dressed then getDressed();[code to actually eat]
pourrait être le meilleur moyen de mettre en œuvre cela pour un humain. Une autre possibilité est que faire si d'autres choses l'exigent washHands
et / ou getDressed
sont appelées? Supposez que vous l'ayez leaveForWork
? Vous devrez peut-être structurer le flux de votre programme pour qu'il soit tel qu'il soit appelé bien avant cela de toute façon.