Aller au contenu
M03 · B. Connaître les principaux piliers de la POO

Les interfaces : des contrats entre classes

Définir une interface, comprendre son utilité, et faire qu'une classe en implémente plusieurs, en Python avec des classes abstraites pures ou des protocoles.

1Situer

Une clinique de Casablanca a un logiciel qui gère des factures, des ordonnances et des rendez-vous. Ces trois choses n'ont rien en commun, et pourtant il faut toutes les imprimer, et certaines doivent être envoyées par e-mail. On ne peut pas leur donner une même classe mère « Document » qui aurait du sens. On leur donne plutôt des capacités : « imprimable », « envoyable ». Ce sont des interfaces.

2Comprendre

Les interfaces : des capacités qu'une classe s'engage à avoir
Imprimableimprimer() Envoyableenvoyer(email) Factureimprimer() envoyer() Ordonnanceimprimer() imprimer_tout : facture ✓ ordonnance ✓ envoyer_tout : facture ✓ ordonnance ✕

Deux interfaces décrivent des capacités : Imprimable exige imprimer(), Envoyable exige envoyer(email).

1 / 5

Une interface est un contrat : une liste de méthodes qu’une classe s’engage à fournir, sans aucun code. Elle décrit une capacité (« je sais m’imprimer ») plutôt qu’une famille.

Les interfaces en Python

Python n’a pas de mot-clé interface. On utilise une classe abstraite pure, qui ne contient que des méthodes abstraites :

class Imprimable(ABC):
    @abstractmethod
    def imprimer(self): ...

Une classe implémente l’interface en en héritant et en écrivant toutes ses méthodes. Elle peut en implémenter plusieurs : class Facture(Imprimable, Envoyable).

Utilité des interfaces

  • Découpler le code : imprimer_tout() ne connaît pas Facture ni Ordonnance, seulement Imprimable.
  • Réunir des classes sans lien de parenté autour d’une même capacité.
  • Remplacer une implémentation par une autre sans toucher au reste.

Classe abstraite ou interface ?

Classe abstraiteInterface
Contientattributs, code, méthodes abstraitesseulement des méthodes abstraites
Représenteune famille (« est un »)une capacité (« sait faire »)
Nombre par classeune en généralplusieurs
Java / PHPabstract class + extendsinterface + implements

Pour aller plus loin

Python propose aussi typing.Protocol : une classe respecte le protocole dès qu’elle a les bonnes méthodes, sans hériter de rien. C’est la version officielle du duck typing : « si ça marche comme un canard et cancane comme un canard, c’est un canard ».

Exemple simple

La prise électrique

Une prise ne sait pas si vous branchez un chargeur, une lampe ou un fer à repasser. Elle exige seulement que la fiche ait la bonne forme. Une interface, c'est la forme de la prise ; chaque appareil l'implémente.

Exemple simple

Le permis de conduire

Le permis atteste que vous savez conduire, quel que soit votre métier. Un médecin et un boulanger peuvent tous deux « implémenter » l'interface Conducteur, et une personne peut avoir plusieurs permis.

class Imprimable(ABC):
    @abstractmethod
    def imprimer(self): ...

class Facture(Imprimable, Envoyable):   # deux interfaces
    ...

3Manipuler

Exécutez. La fonction imprimer_tout() accepte n'importe quel objet Imprimable. Faites implémenter l'interface Envoyable à la classe Ordonnance, puis ajoutez-la à la liste a_envoyer.
Pas à pas dans le lab ↗Python se charge au premier clic (environ 12 Mo, une seule fois).
Console
Mémoire : objets créés

Exécutez le code : les objets et leurs attributs s'afficheront ici.

4Pratiquer

Exercice 1 · L'interface Comparable

Écrivez une interface Mesurable avec une méthode abstraite taille(). Faites-la implémenter par une classe Fichier(nom, octets) et une classe Video(titre, minutes). Écrivez une fonction plus_grand(liste) qui renvoie l'objet de taille maximale.

Voir le corrigé
from abc import ABC, abstractmethod

class Mesurable(ABC):
    @abstractmethod
    def taille(self): ...

class Fichier(Mesurable):
    def __init__(self, nom, octets):
        self.nom, self.octets = nom, octets
    def taille(self):
        return self.octets

class Video(Mesurable):
    def __init__(self, titre, minutes):
        self.titre, self.minutes = titre, minutes
    def taille(self):
        return self.minutes * 60

def plus_grand(liste):
    return max(liste, key=lambda x: x.taille())

Exercice 2 · Classe abstraite ou interface ?

Expliquez la différence entre une classe abstraite et une interface, et donnez un cas pour chacune.

Voir le corrigé
Classe abstraite : une famille de classes proches qui partagent
des attributs et du code (Paiement → Carte, Livraison).
Interface : une capacité, sans code ni attribut, que des classes
sans lien peuvent avoir (Imprimable : Facture, Ordonnance).
Une classe hérite d'une seule famille en général, mais peut
implémenter plusieurs interfaces.

Exercice 3 · Le duck typing

En Python, imprimer_tout() fonctionnerait-elle avec un objet qui a une méthode imprimer() sans hériter de Imprimable ? Testez et expliquez.

Voir le corrigé
Oui. Python ne vérifie pas le type à l'appel : il cherche juste
une méthode imprimer(). C'est le « duck typing » : « si ça marche
comme un canard... ». L'interface ABC sert à rendre le contrat
explicite et à détecter les oublis dès la création de l'objet.

5Vérifier

1. Que contient une interface ?
2. Une classe peut-elle implémenter plusieurs interfaces ?
3. En Java, quel mot-clé utilise une classe pour implémenter une interface ?