Qu’est-ce que l’héritage ?
L’une des choses les plus utiles de la programmation orientée objet, c’est le concept d’héritage. L’héritage vous permet de créer une sous-classe (ou classe enfant) d’une classe parent, qui contient les attributs du parent ainsi que d’autres attributs spécifiques à l’enfant.
Prenons l’exemple de la bibliothèque de films d'un passionné de vieux films de science-fiction. Toute sa bibliothèque est constituée de films. En grand puriste, certains de ses films sont en format cassette ! 📼
Voici un exemple de deux classes : Film
et FilmCassette
.FilmCassette
est une sous-classe/classe enfant deFilm
, etFilm
est une superclasse/classe parent de FilmCassette
.
Notez quewatch()
("Voir") etname
("Nom") sont des attributs de Film dont FilmCassette
hérite. Celui-ci ajoute également ses propres attributs :magnetic_tape
(la "bande magnétique") etrewind()
("rembobiner").
Ce type de relation se produit souvent dans la vraie vie – avez-vous d’autres exemples en tête ?
Pourquoi l’héritage ?
Nous utilisons l’héritage en programmation orientée objet pour plusieurs raisons différentes, mais liées entre elles :
La réutilisabilité
La raison la plus simple est la même que celle pour laquelle nous écrivons des fonctions – la réutilisabilité.
Lorsque nous faisons de notre film de science-fiction une sous-classe de Film, nous n’avons pas besoin d’ajouter à nouveau notre attribut name
, ni de réécrire notre méthodewatch()
.
Imaginez que nous ayons une douzaine de sous-classes de films de science-fiction – cela représenterait beaucoup de code copié-collé, en l’absence d’héritage ! Si vous vouliez modifier la fonctionnalité watch()
, il faudrait alors mettre à jour chaque sous-classe individuellement.
L'extensibilité
L’héritage permet également l’extensibilité – c’est-à-dire la possibilité d’étendre la fonctionnalité d’un programme sans avoir à modifier le code existant.
Imaginons que vous proposiez deux options pour contacter vos utilisateurs – par SMS ou par hibou 🧙♀️ :
Comme vous pouvez le constater, la classe ContactSystem
définit un comportement – send(message)
– et a comme sous-classes SMSContactSystem
et OwlContactSystem
.
Si une classe Utilisateur
contient un canal de contact favori – de type ContactSystem
– nous savons que nous pouvons appeler send()
dessus, et qu’on lui enverra ce message particulier avec l’option qu’il a choisie.
Au-delà de cela, imaginons que nous voulions étendre la fonctionnalité de notre système en ajoutant un nouveau moyen de contacter nos utilisateurs : par la poste. Si nous créons une sous-classe nommée PostContactSystem
et que nous l’implémentons, nous n’avons rien à changer dans notre classe Utilisateur, ni dans aucune partie du code impliquée dans l’envoi de messages !
Les modèles
Enfin, l’un des avantages de l’héritage concerne la façon dont nous concevons les systèmes. L’héritage, et les classes en général, nous permettent d’exprimer des relations entre différentes parties de notre code.
Tout comme nous regroupons des données et du code au sein d’un paquet en utilisant les classes, nous relions les classes qui sont conceptuellement apparentées grâce à l’héritage. Nous entrerons plus en détail dans les hiérarchies d’héritage et les multiples niveaux d’héritage au chapitre 4.
Les classes et l’héritage sont utiles, car ils rendent les systèmes plus faciles à comprendre. Cela permet aux développeurs et aux équipes de développement de construire les modèles conceptuels des comportements et des données dans le système – ce qui prend encore plus d’importance lors de la maintenance et de l’extension de projets vastes et complexes.
À vous de jouer : utilisez l'héritage
Dans la première partie, vous avez fait un exercice impliquant d’identifier des classes dans une description de problème. Nous avons décomposé ces classes en état et comportement, par écrit.
Ci-dessous, vous trouverez quelques lignes décrivant une problématique. À partir de cette description, identifiez les classes, leurs état et comportement, et identifiez quelles classes sont les classes enfants/parents des autres.
Fort de votre expérience en pâtisserie, vous décidez de créer un forum en ligne pour parler de gâteaux ! 🥞🥮 Sur ce forum, les utilisateurs fans de pâtisserie pourront :
s’inscrire et se connecter ;
parler de leurs gâteaux préférés, en créant de nouveaux fils de discussion ;
répondre à des messages, dans les fils existants.
Un fil de discussion sur ce forum a un titre, une date de création et une collection de posts lui correspondant.
Chaque post contient du texte, l’utilisateur qui l’a publié et la date de publication.
Les utilisateurs ont la possibilité d’attacher des fichiers à leurs posts :
Partez du principe qu’il peut y avoir de nombreux types de fichiers, mais nous sommes surtout intéressés par les fichiers images.
Un post peut avoir un fichier attaché, ce qui changera la façon dont le post est affiché. Ce serait donc un nouveau type de post.
Enfin, il y a des utilisateurs spéciaux nommés modérateurs, qui ont la capacité de modifier un post pour qu’il contienne du contenu nouveau, et de supprimer ceux qui ne parlent pas de gâteaux. ;)
En résumé
Une classe peut avoir une classe parent, classe mère ou superclasse.
La classe qui a un parent est nommée sous-classe, classe fille ou classe enfant.
Cette classe hérite d’attributs de son parent.
La classe enfant peut implémenter des attributs supplémentaires, en plus de ceux dont elle hérite.
Maintenant que vous comprenez les concepts liés à l’héritage, rejoignez-moi au prochain chapitre, dans lequel nous écrirons quelques sous-classes.