• 20 hours
  • Medium

Free online content available in this course.

course.header.alt.is_video

course.header.alt.is_certifying

Got it!

Last updated on 2/1/19

Héritez de nouvelles connaissances

Log in or subscribe for free to enjoy all this course has to offer!

Vous commencez maintenant à avoir une bonne idée de ce qu'est la POO. Et dans ce chapitre, nous allons découvrir ce qui en fait toute sa puissance : l'héritage !

Introduction à l'héritage

Comme c'est un chapitre important, je ne vais pas arriver à vous l'expliquer tout seul. C'est la raison pour laquelle je vous présente Bob mon assistant dans ce chapitre.

Bob
Bob

Essayons de représenter Bob en orienté objet. Bob peut aboyer, courir, manger, dormir, il a une taille, un poids et une couleur.

Certes on pourrait le décrire plus précisément, mais c'est déjà pas mal. Laissez-moi maintenant vous présenter Raul.

Raul
Raul

Raul et Bob sont évidemment très différents. Essayons de décrire Raul en orienté objet. Raul a une taille, un poids et une couleur. Il peut chanter, voler, manger, dormir.

Hmmm... Selon notre classification, il semblerait que les classes Dragon et Chien ne sont pas si différentes. La plupart de leurs propriétés et méthodes sont identiques. Donc si on devait écrire l'implémentation des méthodes, on ferait deux fois la même chose. Or un développeur déteste se répéter ! On va donc utiliser l'héritage !

L'héritage permet de créer un arbre de classe. Dans notre exemple, nous avons deux animaux qui partagent des caractéristiques communes. En fait, on aurait pu décrire une classe Animal comme ceci :

Oui, mais le problème, c'est qu'on a été obligé d'enlever certaines méthodes comme aboyer ou voler, car elles ne sont pas valables pour tous les animaux. Il faut que l'on puisse garder nos classes Chien et Dragon pour gérer ces spécificités.

Alors que fait-on ? Nous allons modifier Chien et Dragon pour supprimer tout ce qui est commun et du coup peut être mis dans la classe Animal. Et on va dire que les classes Dragon et Chienhéritent de la classeAnimal.

Mais qu'est-ce que ça veut dire "hérite de" ?

Et bien, très concrètement, lorsque la classe Chien hérite de la classe Animal, toutes les propriétés et méthodes de la classe Animal sont disponibles dans la classe Chien. C'est comme si je les avais écrites dans la classe Chien. Je peux écrire par exemple :

let bob = Chien()
bob.taille = 120
bob.poids = 30
bob.manger()

Les propriétés et méthodes de l'exemple ci-dessus ne sont pas définies dans la classe Chien, mais dans la classe Animal et en héritant de cette classe, la classe Chien les récupère. L'héritage, c'est juste ça.

L'héritage en action

Avant d'aborder l'implémentation de l'héritage, laissez-moi vous donner un exemple d'héritage en iOS. Je vous l'ai dit en introduction, en iOS, tout est objet. Et la plupart d'entre eux utilisent l'héritage !

iOS et l'héritage

C'est notamment très clair pour l'interface graphique. L'interface graphique est pleine de composants. Il peut y avoir des images, des boutons, des labels, etc. Ces composants vont être disposées sur l'interface et ont donc beaucoup de choses en commun : leur taille, leur position, leur couleur, s'ils sont visibles ou non, s'ils réagissent au toucher ou non et beaucoup d'autres. C'est la raison pour laquelle ils héritent tous d'UIView, une classe qui gère tous ces aspects et permet donc à tous les composants de ne pas avoir à répéter toute cette logique. Il suffit qu'ils en héritent !

Le bus scolaire et l'héritage

Prenons un autre exemple, mais cette fois-ci avec notre bus scolaire. En début de cours, nous avions créé ensemble le diagramme suivant :

En utilisant l'héritage, nous allons pouvoir modifier ce schéma et rajouter quelques classes :

Alors, regardons un peu tout cela. Tout d'abord nous allons rajouter la classe SchoolBus. Cette classe hérite de la classe Bus. La classe SchoolBus définit un bus scolaire. La différence avec un bus classique, c'est que le bus scolaire va avoir une propriété en plus : schoolName. Car le bus scolaire est associé à une école. Par ailleurs, la méthode drive de SchoolBus va être légèrement différente de la méthode drive de Bus. Car le bus scolaire va s'arrêter à chaque maison pour récupérer les enfants et ensuite les déposer à l'école tandis que le bus simple roule seulement sur la route.

Par ailleurs, nous avons deux autres nouvelles classes : HomeRoadSection et SchoolRoadSection qui héritent toutes les deux de RoadSection. Chacune de ces trois classes vont avoir des initialisations différentes qui vont nous permettre de dessiner sur le canevas des sections de route avec ou sans maison et avec ou sans école. La classe HomeRoadSection a en plus une variable children qui va nous permettre de savoir combien d'enfants le bus va récupérer dans cette maison.

Implémenter l'héritage

Voici venu le moment que vous attendez tous ! Comment fait-on dans le code pour dire qu'une classe hérite d'une autre ? Et bien, comme pour beaucoup de choses avec Swift, c'est très simple !

Essayons de créer notre classe SchoolBus qui hérite de Bus. Il suffit d'écrire la création de classe comme on a l'habitude de faire :

class SchoolBus {

}

Et maintenant, pour appliquer l'héritage, on ajoute : puis la classe dont on veut hériter (Bus en l'occurrence) :

class SchoolBus: Bus {

}

Alors que l'implémentation de SchoolBus semble vide, je peux utiliser toutes les propriétés et méthodes de Bus :

var unBusScolaire = SchoolBus(driverName: "Joe")
unBusScolaire.seats = 50
unBusScolaire.drive(road: road)

C'est la beauté de l'héritage. Maintenant je vais rajouter une propriété spécifique à SchoolBus :

class SchoolBus {
    var schoolName = ""
}

La propriété schoolName sera disponible dans la classe SchoolBus, mais pas pour les instances de Bus.

Et voilà ! Je vous l'avais promis, l'héritage avec Swift, c'est simple.

Exercice

Entraînez-vous avec cet exercice !

En résumé

  • Une classe (dite fille) peut hériter d'une autre classe (dite mère). Dans ce cas, toutes les propriétés et méthodes de la classe mère sont disponibles dans la classe fille sans que la classe fille ait besoin de le redéfinir.

  • L'héritage permet d'organiser son code grâce à un arbre d'héritage et d'éviter ainsi des répétitions.

  • Pour qu'une classe hérite d'une autre, on utilise les : suivi du nom de la classe mère :

    class Fille: Mere {
        
    }

 

Example of certificate of achievement
Example of certificate of achievement