Interfaces
Une interface est un contrat qui définit un ensemble de méthodes (et parfois de constantes) qu'une classe s'engage à implémenter.
Une interface décrit ce qu'un objet sait faire, sans expliquer comment il le fait.
Rôle fondamental des interfaces
Les interfaces permettent de :
- Séparer le "quoi" du "comment"
- Favoriser le polymorphisme
- Réduire le couplage
- Faciliter les tests
- Appliquer les principes SOLID
Interface vs classe abstraite
| Interface | Classe abstraite |
|---|---|
| Aucun état (ou très limité) | Peut avoir des attributs |
| Contrat pur | Implémentation partielle |
| Héritage multiple possible | Héritage simple |
Comportement imposé Comportement partagé
Les deux sont complémentaires.
Structure d'une interface
Exemple générique :
- Pas d'implémentation
- Méthodes implicitement public
- Pas de constructeur
Implémentation d'une interface
La classe doit implémenter toutes les méthodes.
Interfaces et polymorphisme
- Payable p = new CarteBancaire();
- p.payer(100);
- Type statique : Payable
- Type réel : CarteBancaire
Le comportement dépend de l'objet réel.
Interfaces multiples
Une classe peut implémenter plusieurs interfaces.
- class Smartphone implements Appelable, Connectable {}
Alternative puissante à l'héritage multiple.
Interfaces et découplage
Le service dépend d'une abstraction, pas d'une implémentation.
Interfaces et SOLID
- S : une interface = un rôle
- O : ajout de nouvelles implémentations sans modification
- L : respect du contrat
- I : interfaces spécifiques
- D : dépendre d'interfaces
Interfaces et injection de dépendances
Les dépendances sont fournies de l'extérieur.
Méthodes par défaut (Java, C#)
À utiliser avec parcimonie.
Constantes dans les interfaces
Elles sont implicitement public static final.
Interfaces fonctionnelles
Une seule méthode abstraite.
Interfaces et tests unitaires
- class FakePaiement implements Payable {}
Remplacement facile pour tests.
Interfaces et design patterns
| Pattern | Rôle de l'interface |
|---|---|
| Strategy | Comportement interchangeable |
| Factory | Type abstrait retourné |
| Adapter | Contrat cible |
| Observer | Communication découplée |
| Decorator | Extension dynamique |
Interfaces en UML
Notation :
- <<interface>>
- + payer(montant : double) : void
Implémentation :
Interfaces selon les langages
| Langage | Particularités |
|---|---|
| Java | Méthodes par défaut, privées |
| C# | Implémentation explicite |
| PHP | Pas d'attributs |
| Python | Protocols / ABC |
| C++ | Interfaces via classes abstraites |
| Free Pascal / Delphi | interface natif |
Exemple Free Pascal / Delphi
Erreurs fréquentes
- Interfaces trop larges
- Interfaces dépendantes de l'implémentation
- Utiliser interfaces comme classes
- Briser le contrat implicite
Bonnes pratiques
- Interfaces petites et ciblées
- Noms orientés rôle
- Programmer contre des interfaces
- Favoriser la composition
- Éviter les interfaces "fourre-tout"
Exemple complet
Interfaces et architecture
Les interfaces :
- Délimitent les couches
- Stabilisent les contrats
- Facilitent la maintenance
- Favorisent l'évolutivité
Conclusion
Les interfaces sont la clef de la flexibilité en POO.
Elles permettent de construire des systèmes ouverts, testables et maintenables.
Une bonne interface est un contrat clair, stable et minimal.