Accueil > Programmation orientée objet >
đ HĂ©ritage et polymorphisme
Survol et attentes
En créant des logiciels plus complexes, plusieurs objets peuvent avoir des caractéristiques communes. Par exemple, un jeu vidéo peut avoir plusieurs types de personnages, mais tous les personnages ont des caractéristiques communes comme la position, la vitesse, la direction, etc. Dans ce cas, il est utile de créer une classe de base qui contient les caractéristiques communes, puis de créer des classes dérivées qui contiennent les caractéristiques spécifiques à chaque type de personnage.
Définitions
LâhĂ©ritage nous perment de dĂ©clarer une classe parente qui contient des attributs et des mĂ©thodes communes Ă plusieurs classes enfants.
Les classes enfants hĂ©ritent des attributs et des mĂ©thodes de la classe parente. Les classes enfants peuvent supplanter la dĂ©finition dâune mĂ©thode de la classe parente, comme on lâa dĂ©jĂ vu avec les mĂ©thodes toString(), equals()ethashCode()`. Elles peuvent aussi avoir leurs propres attributs et mĂ©thodes.
Seulement les attributs de visibilitĂ© protected ou public dâune classe parent seront hĂ©ritĂ©s par les enfants. La nouvelle visibilitĂ© protected est comme private sauf pour les membres de la mĂȘme famille. Donc, les attributs private de la classe parent appartiennent uniquement au parent tandis que les attributs protected seront hĂ©ritĂ©s.
Notez que la visibilité par défaut (sans déclaration explicite) est
package-privatequi est commepublicĂ lâintĂ©rieur du package et commeprivateĂ lâextĂ©rieur. Vous ne pouvez pas explicitement dĂ©clarer quelque chosepackage-private⊠simplement nâutilisez pas de mot-clĂ© si vous voulez ce niveau de visibilitĂ©.
Exemples et solutions
Une classe enfant indique son lien de parentĂ© en utilisant le mot-clĂ© extends dans sa dĂ©claration. Par exemple, la classe Warrior peut ĂȘtre dĂ©clarĂ©e comme suit :
public class Warrior extends Player {
// ...
}
Une classe enfant peut rĂ©utiliser le constructeur de sa classe parente en utilisant la mĂ©thode super() dans son constructeur. Par exemple, la classe Warrior peut ĂȘtre dĂ©clarĂ©e comme suit :
public class Warrior extends Player {
public Warrior(String name, int health, int strength) {
super(name, health, strength);
}
}
présumant que la classe Player a déclarée un constructeur comme suit :
public class Player {
protected String name;
protected int health;
protected int strength;
public Player(String name, int health, int strength) {
this.name = name;
this.health = health;
this.strength = strength;
}
}
Le mot-clĂ© super() sâapplique aux autres mĂ©thodes de la classe parente Ă©galement. Sâil est utilisĂ©, ça doit toujours ĂȘtre la premiĂšre instruction dans la mĂ©thode de la classe enfant qui supplante la mĂ©thode originale.
Dans un diagramme de classe UML, on indique la relation dâhĂ©ritage avec une ligne solide et une tĂȘte de flĂšche en triangle pointant vers la classe parente. Par exemple, les classes Warrior, Wizard et Healer hĂ©ritent toutes de la classe Player :
Relation âest unâ
LâhĂ©ritage est une relation âest unâ. Par exemple, un Warrior est un Player. On peut donc utiliser un objet de type Warrior partout oĂč un objet de type Player est attendu. Par exemple, on peut dĂ©clarer une variable de type Player et lui assigner un objet de type Warrior ou Ă dâautres types qui sont des extensions de Player :
ArrayList<Player> players = new ArrayList<>();
players.add(new Warrior("Conan", 90, 10));
players.add(new Wizard("Gandalf", 50, 5));
players.add(new Healer("Rowena", 100, 2));
La liste est dĂ©clarĂ©e comme une liste de Player, mais on peut y ajouter des objets de type Warrior, Wizard et Healer parce que ces classes âsont desâ Player via lâhĂ©ritage. Quand les objets de type parent pointent Ă des instances de type enfant, cela sâappelle le polymorphisme. Le polymorphisme fait spĂ©cifiquement rĂ©fĂ©rence Ă la capacitĂ© dâappeler la mĂȘme mĂ©thode sur des objets de types diffĂ©rents et dâobtenir des rĂ©sultats diffĂ©rents : cette mĂ©thode a plusieurs formes, littĂ©ralement la dĂ©finition de polymorphisme.
La vidĂ©o suivante prĂ©sente un bon portrait du polymorphisme possible via lâhĂ©ritage, soit celui qui est possible en prenant des types enfants pour le type parent : đș Upcasting et downcasting
Objectifs dâapprentissage
Ă la fin de cette leçon vous devrez ĂȘtre en mesure de :
- Comprendre et expliquer le concept dâhĂ©ritage, notamment en connaissant le sens des termes classe parente, classe enfant, et des mots-clĂ©
extendsetsuperen Java. - Comprendre et expliquer le concept de polymorphisme, notamment en connaissant la relation âest unâ.
- Identifier la classe parente et la classe enfant dans un diagramme de classe UML.
CritĂšres de succĂšs
- Je peux dĂ©clarer une classe enfant qui hĂ©rite dâune classe parente
- Je peux réutiliser le code pertienent de la classe parente avec le mot-clé super et supplanter les méthodes de la classe parente avec du code plus approprié.
- Je peux déclarer une variable de type parent et lui assigner un objet de type enfant.
Exercices
Quiz de validation des connaissances
Travail pratique :
-
Créer les fichiers appropriés pour les classes suivantes et remarquez ce qui se passe en lançant la classe
App:public class Parent { String name; Parent(String name) { this.name = name; } void role() { System.out.print("I'm the "); } void sayName() { System.out.println("My name is " + name); } }public class Dad extends Parent { Dad(String name) { super(name); } @Override void role() { super.role(); // toujours en premier... réutilise le code de la classe parente System.out.println("dad."); } @Override // supplante (prend priorité sur) la version dans la classe parente void sayName() { System.out.println("My name is Mr. " + name + "."); } }public class App { public static void main(String[] args) { Dad dad = new Dad("John"); dad.role(); dad.sayName(); } } -
Créer deux classes
MometLegalGuardianqui héritent deParentet qui modifient le code hérité de maniÚre appropriée. Ajouter des déclarations dans la classeApppour tester votre code. -
Préparer un diagramme de classe UML pour les classes
Parent,Dad,MometLegalGuardianet vérifier votre diagramme avec votre enseignant(e).