0 XP
?
Intermédiaire50 min35 XP

Objectifs de cette leçon

  • Utiliser le polymorphisme pour appeler la même méthode différemment
  • Comprendre la surcharge de méthodes
  • Appliquer le principe de substitution de Liskov

Polymorphisme : un seul nom, mille visages 🎭

Polymorphisme = "poly" (plusieurs) + "morphisme" (formes). Un même mot, plusieurs significations selon le contexte.


1. Le polymorphisme dans la vie 🎯

pseudo CLASSE Forme FONCTION aire() RETOURNER 0 ⬅ Par défaut, une forme n'a pas d'aire FIN FONCTION FIN CLASSE

CLASSE Rectangle HÉRITE DE Forme largeur : réel hauteur : réel

CONSTRUCTEUR(largeur, hauteur)
    self.largeur ← largeur
    self.hauteur ← hauteur
FIN CONSTRUCTEUR

' MÊME méthode, mais CHAQUE forme calcule différemment
FONCTION aire()
    RETOURNER self.largeur × self.hauteur  ⬅ largeur × hauteur
FIN FONCTION

FIN CLASSE

CLASSE Cercle HÉRITE DE Forme rayon : réel

CONSTRUCTEUR(rayon)
    self.rayon ← rayon
FIN CONSTRUCTEUR

FONCTION aire()
    RETOURNER π × self.rayon × self.rayon  ⬅ π × r²
FIN FONCTION

FIN CLASSE


```python
class Forme:
    def aire(self):
        return 0

class Rectangle(Forme):
    def __init__(self, largeur, hauteur):
        self.largeur = largeur
        self.hauteur = hauteur

    def aire(self):
        return self.largeur * self.hauteur

class Cercle(Forme):
    def __init__(self, rayon):
        self.rayon = rayon

    def aire(self):
        return 3.14 * self.rayon ** 2

class Triangle(Forme):
    def __init__(self, base, hauteur):
        self.base = base
        self.hauteur = hauteur

    def aire(self):
        return 0.5 * self.base * self.hauteur

3. La magie : un seul appel, mille résultats ✨

Exécution pas à pas

pseudo
1/27
▶️
' On crée un mélange de formes
⚙️' On crée un mélange de formesLe programme exécute cette action, puis passe à la suivante.

Le programme exécute cette instruction, puis passe à la suivante.

💡 Sans polymorphisme, on devrait écrire :

Exécution pas à pas

pseudo
1/4
SI forme EST Rectangle ALORS calculer_rectangle(forme)
forme EST Rectangle calculer_rectangle(forme)OUINON❓ DécisionOn vérifie si "forme EST Rectangle calculer_rectangle(forme)" est vraie. Le programme choisit entre deux chemins.

Question : "forme EST Rectangle calculer_rectangle(forme)" est-elle vraie ? Le programme choisit entre deux chemins.

Avec polymorphisme, on écrit juste forme.aire() et chaque objet se débrouille !


4. Le polymorphisme c'est aussi "duck typing" 🦆

"Si ça marche comme un canard et que ça cancane comme un canard, alors c'est un canard !"

En Python, on ne se demande pas "est-ce que c'est un Canard ?". On se demande juste "est-ce que ça a une méthode cancaner() ?"

class Canard:
    def nager(self):
        return "Le canard nage"
    def cancaner(self):
        return "Coin coin !"

class Cygne:
    def nager(self):
        return "Le cygne glisse"
    def cancaner(self):
        return "Sssiii..."

class Oie:
    def nager(self):
        return "L'oie barbote"
    def cancaner(self):
        return "Ouink !"

def faire_nager(oiseau):
    print(oiseau.nager())
    print(oiseau.cancaner())

# Peu importe la classe, du moment qu'elle a nager() et cancaner() !
faire_nager(Canard())   # ✅
faire_nager(Cygne())    # ✅
faire_nager(Oie())      # ✅

Schéma récapitulatif 📊

💡 Quand utiliser le polymorphisme ? Quand tu as plusieurs objets qui font la MÊME chose mais de façon DIFFÉRENTE ! Exemples : animaux qui parlent, formes qui calculent leur aire, véhicules qui démarrent, fichiers qui s'exportent...

Exécution pas à pas

0/5

État de la mémoire

8 variables
Variable
Valeur
Type
Addr.
forme1.type
Rectangle
class
0x1900
forme1.largeur
5
int
0x1904
forme1.hauteur
3
int
0x1908
forme2.type
Cercle
class
0x1910
forme2.rayon
2
int
0x1914
forme3.type
Triangle
class
0x1920
forme3.base
4
int
0x1924
forme3.hauteur
6
int
0x1928
forme1.type0x1900
Rectangle
class
forme1.largeur0x1904
5
int
forme1.hauteur0x1908
3
int
forme2.type0x1910
Cercle
class
forme2.rayon0x1914
2
int
forme3.type0x1920
Triangle
class
forme3.base0x1924
4
int
forme3.hauteur0x1928
6
int

⚡ Simulateur — Polymorphisme

Étape 1/7
📝 Pseudo-code
1CLASSE Forme # ← classe abstraite
2 FONCTION aire() # ← méthode par défaut
3 RETOURNER 0
4 FIN FONCTION
5FIN CLASSE
6
7CLASSE Rectangle HÉRITE DE Forme # 🧬 hérite
8 largeur : réel
9 hauteur : réel
10 CONSTRUCTEUR(largeur, hauteur)
11 self.largeur ← largeur
12 self.hauteur ← hauteur
13 FIN CONSTRUCTEUR
14 FONCTION aire() # ⬅ redéfinit aire()
15 RETOURNER self.largeur × self.hauteur
16 FIN FONCTION
17FIN CLASSE
18
19CLASSE Cercle HÉRITE DE Forme # 🧬 hérite aussi
20 rayon : réel
21 CONSTRUCTEUR(rayon)
22 self.rayon ← rayon
23 FIN CONSTRUCTEUR
24 FONCTION aire() # ⬅ sa propre version
25 RETOURNER π × self.rayon × self.rayon
26 FIN FONCTION
27FIN CLASSE
28
29r ← Rectangle(5, 3) # ⬅ créer rectangle
30c ← Cercle(2) # ⬅ créer cercle
31afficher(r.aire()) # ⬅ MÊME appel .aire()
32afficher(c.aire()) # ⬅ résultat DIFFÉRENT
🎭 Résolution polymorphique
Hiérarchie
Forme
💡 Polymorphisme
  • Même appel de méthode → comportement différent
  • Python cherche la méthode dans le type réel
  • Si absente, il remonte la hiérarchie
  • Code plus flexible et extensible

Classe de base Forme. aire() retourne 0 par défaut.