6.3. Le polymorphisme :#
Objectifs
L’objectif de ce cours est que vous compreniez le concept de polymorphisme dynamique.
Indication
Pour ceux qui auraient déjà des notions de POO, on peut noter que le polymorphisme dynamique est en général enseigné en même temps que l’héritage (point suivant de ce cours). Le fait que python utilise du typage canard (duck typing) nous permet d’aborder la notion de manière isolée. Cela a notamment l’intérêt de montrer que l’héritage n’est pas indispensable pour mettre en oeuvre le polymorphisme.
6.3.1. définition#
Le polymorphisme dynamique est un concept très important de la POO. Il est sa plus grande force et peut-être une de ses plus grandes faiblesses.
Le polymorphisme permet d’utiliser un même nom de méthode sur des objets de types différents sans avoir besoin de connaître le type de ces objets. L’adjectif dynamique indique que l’interpréteur découvre à l’exécution quelle est la fonction à exécuter. En python tout est dynamique puisque le langage est interprété. Il faut savoir que certains langages compilés proposent un polymorphisme statique (que nous ne détaillerons pas ici).
Voici un exemple de code mettant en œuvre le polymorphisme dynamique. On imagine
from game_object import Monster, Bonus, Trap
def init(game_objects):
#création des éléments du jeu
game_objects = [Monster(1,2),Monster(4,3),Bonus(3,5),Bonus(5,5),Trap(3,3)]
...
def show(game_objects):
#utilisation du polymorphisme
for go in game_objects :
#on n'a pas à se soucier du type de go
go.show()
...
def live(game_objects,dt):
#utilisation du polymorphisme
for go in game_objects :
#on n'a pas à se soucier du type de go
go.live(dt)
...
Si les 3 classes Monster, Bonus, Trap proposent des méthodes show() et live(), alors ces méthodes seront appelées dans les fonctions du programme ci-dessus. Vraisemblablement, les monstres auront une fonction show() qui aurait une forme différente de la fonction show() du bonus. La fonction show() a donc plusieurs formes pour la collection d’objet contenue par la liste game_object. Le mécanisme du polymorphisme choisira la bonne forme à l’exécution.
6.3.2. critique du polymorphisme dynamique#
Le polymorphisme dynamique implique que lorsqu’on appelle une méthode sur un objet, le programme cherche quelle est la bonne forme de la fonction à appeler. Cela provoque une « indirection ». Il faut chercher dans la table des fonctions connues par la classe de l’objet, celle qui porte le nom qu’on invoque; Là où, sans le polymorphisme, le compilateur aurait directement remplacé le nom de la fonction par l’adresse de cette fonction. Le recours systématique au mécanisme du polymorphisme dynamique lors de l’appel de méthodes, implique l’ajout systématique d’indirections. Mises bout à bout, toutes ces indirections augmentent significativement les temps de calcul alors qu’en pratique les situations d’appels de fonction pour lesquelles ce mécanisme est utile sont très peu fréquentes.
6.3.3. Exercice (à compléter)#
proposer 3 classes : Round, Square, Point avec chacune une version différente de la méthode compute_area.
remplissez une liste de ronds, carrés et points.
Calculer l’aire totale des formes contenues par cette liste.