5.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 de typage canard (duck typing) nous permet d’aborder la notion de manière isolée. Cela a notamment l’intérêt de montrer de l’héritage n’est pas indispensable pour mettre en oeuvre le polymorphisme.
5.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 grande faiblesse.
La 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 objet. 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):
#creation des éléments du jeux
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é 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 forme pour la collection d’objet contenue par la liste game_object
. Le mécanisme du polymorphisme choisira la bonne forme à l’exécution.
5.3.2. critique du polymorphisme dynamique#
Le polymorphisme dynamique implique que lorsqu’on appelle une méthode sur un objet, le programme cherche qu’elle 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 augmente significativement les temps de calcul alors qu’en pratique les situation d’appels de fonction pour lesquels ce mécanisme est utile sont très peu fréquente.
5.3.3. Exercice (à compléter)#
proposer 3 classes : Round, Square, Point avec chacune une version différente de la méthode méhtode compute_area
.
remplissez un liste de rond, carrés et points.
Calculer l’aire totale des formes contenues par cette liste.