1A.2 - Classes, héritage

L'héritage permet de réécrire certaines parties du code sans pour autant enlever les anciennes versions toujours utilisées.

Qu'est-ce que l'héritage ?

La séance précédente a montré comment fonctionnait une classe, comment elle s'écrivait. Cette séance est à propos de l'héritage qui est une propriété des langages objets. Elle est utile par exemple lorsqu'on doit écrire plusieurs versions d'un même algorithme et qu'une petite partie seulement change d'une version à l'autre.

Supposons que vous ayez un algorithme constitué de trois fonctions plus une dernière qui appelle les trois autres dans le bon ordre. On désire créer une version pour laquelle une des trois fonctions seulement est modifiée.

On souhaite changer la fonction fonction2 sans modifier la classe Version1 et en écrivant le moins possible de code.

Le langage a compris qu'on avait changé une fonction et il s'en sert dans la seconde classe. Pour que cela fonctionne, il faut néanmoins respecter une contrainte essentielle : la fonction remplacée (ou surchargée) doit accepter les mêmes paramètres et retourner le même type de résultat. Cette contrainte n'est pas obligatoire en Python mais elle l'est dans la plupart des langages. Il est conseillé de la respecter.

Exercice 1 : pièce normale

On créer une classe Piece qui contient deux méthodes : une méthode tirage_aleatoire et une méthode qui appelle la précédente pour faire une moyenne sur $n$ tirages.

Exercice 2 : pièce truquée

Le paramètre precedent est inutile dans cette première version mais on suppose maintenant que le joueur qui joue est un tricheur. Lorsqu'il perd, il joue une pièce truquée le coup d'après pour laquelle la probabilité d'avoir 1 est de 0,7. On veut implémenter cela avec une classe PieceTruquee.

Pour choisir de faire telle ou telle avec une probabilité de 0,7, on peut écrire :

Utiliser des méthodes de la classe mère

Lorsqu'on change une fonction, on a parfois juste d'un petit changement par rapport à la méthode précédente qu'il faut pouvoir appeler. Si on reprend l'exemple précédent, on modifie la méthode tirage_aleatoire pour retourner l'autre valeur :

Une autre écriture possible est la suivante avec le mot-clé super :

Exercice 3 : Pièce mixte

Ecrire une classe PieceTruqueeMix qui appelle aléatoiremnt soit Piece.tirage_aleatoire soit PieceTruquee.tirage_aleatoire.

Autre construction avec des fonctions

La création de classe peut sembler fastidieuse. Une autre solution est l'utilisation de fonction comme paramètre d'une autre fonction :

Exercice 4 : pièce mixte avec des fonctions

Comment utiliser les fonctions dans le cas de la pièce PieceTruqueeMix ?