À retenir
- C'est un mécanisme de réutilisation de code (composition).
- On ne peut pas créer un objet directement à partir d'un trait (non instanciable).
- Il permet de contourner les limites de l'héritage simple tout en évitant les problèmes de l'héritage multiple.
Un trait est un bloc de code réutilisable qui contient des fonctionnalités (méthodes) que l'on peut greffer à une classe. Imaginez-le comme un « kit de compétences » que l'on peut donner à différents objets sans avoir besoin qu'ils appartiennent à la même famille (héritage). Par exemple, un trait « Voler » pourrait être ajouté aussi bien à une classe Avion qu'à une classe Oiseau.
Étymologie
Le terme provient directement du français et de l'anglais « trait », désignant un caractère distinctif ou une caractéristique. En programmation, ce concept a été formalisé pour offrir une alternative plus flexible à l'héritage multiple, permettant de partager du comportement entre classes de manière modulaire.
Exemples d'usage
- En PHP, on utilise un
traitpour partager une méthode de journalisation (logs) entre plusieurs classes indépendantes commeCommandeetUtilisateur. - En Rust, les traits définissent des capacités partagées par différents types (comme le trait
Displaypour l'affichage textuel).
Cas d'usage
On utilise les traits principalement pour éviter la duplication de code quand plusieurs classes ont besoin de la même logique, mais qu'elles ne peuvent pas hériter d'une même classe parente. C'est très fréquent dans les frameworks web pour ajouter des fonctionnalités transversales (sécurité, validation, formatage).
Bonnes pratiques
Il ne faut pas abuser des traits pour masquer une mauvaise architecture : si une classe utilise trop de traits, elle risque de devenir complexe et difficile à suivre. Il est également crucial de bien gérer les conflits de noms de méthodes, car plusieurs traits injectés dans une même classe pourraient avoir des fonctions portant le même nom.
Synonymes
Antonymes
Conseil
Si vous débutez, voyez les traits comme des « plugins » pour vos classes. Utilisez-les quand vous vous surprenez à faire un copier-coller d'une fonction entre deux classes qui n'ont rien à voir entre elles.
Questions fréquentes
Quelle est la différence entre un trait et une interface ?
Une interface définit ce qu'une classe DOIT faire (le contrat), tandis qu'un trait fournit déjà le COMMENT (le code concret de la méthode).
Un trait peut-il avoir des propriétés ?
Cela dépend du langage : en PHP, oui, un trait peut avoir des variables, mais en Rust, ils servent principalement à définir des méthodes de comportement.