Théorie 1.2.5: polymorphisme #
-
Polymorphisme veut simplement dire plusieurs formes
-
Considérer la hiérarchie suivante:
-
Un véhicule peut prendre plusieurs formes:
Mobilette,Auto,Camion, etc.
L’héritage veut dire est un #
- Considérer la méthode suivante:
public boolean accepterSiDeuxRoues(Vehicule vehicule) {
return vehicule.nombreDeRoues() == 2;
}
- Tous ces appels à la méthodes sont valides:
accepterSiDeuxRoues(new Vehicule());
accepterSiDeuxRoues(new DeuxRoues());
accepterSiDeuxRoues(new Moto());
accepterSiDeuxRoues(new Mobilette());
- C’est à dire, via l’héritage et le polymorphisme:
- un objet
Vehiculeest unVehicule - un objet
DeuxRouesest unVehicule - un objet
Motoest unVehicule - un objet
Mobiletteest unVehicule
- un objet
Accéder aux méthodes #
- Considérer à nouveau la méthode suivante:
public boolean accepterSiDeuxRoues(Vehicule vehicule) {
return vehicule.nombreDeRoues() == 2;
-
On peut appeler la méthode
nombreDeRoues()sur l’objetvehicule- car cette méthode est définie dans la classe
Vehicule
- car cette méthode est définie dans la classe
-
On ne pourrait pas appeler la méthode
marqueDeMobilette()sur l’objetvehicule- car cette méthode est définie dans la classe
Mobilette
- car cette méthode est définie dans la classe
-
Comme l’objet
vehiculeest de typeVehicule, on peut seulement accéder- aux méthodes définies dans la classe
Vehicule - même si la méthode
accepterSiDeuxRouesavait été appelée comme suit:
- aux méthodes définies dans la classe
accepterSiDeuxRoues(new Mobilette());
- c-à-d même si l’objet
vehiculeest en réalité uneMobilette, on accède- aux méthodes propres au type donné dans le code
Vérifier le type réel #
- Considérer maintenant la méthode suivante:
public boolean accepterSiVespa(Vehicule vehicule) {
boolean accepter = false;
if(vehicule instanceof Mobilette){
accepter = true;
}
return accepter;
}
-
L’opérateur
instanceofvérifie le type réel de l’objetvehicule, ici:- retourne vrai si
vehiculeest en fait uneMobilette - retourne faux sinon
- retourne vrai si
-
Mais on a toujours pas vérifié si c’est une Vespa, non?
Transtypage #
-
Transtype (casting) veut dire changer le type
-
Pour accéder à une méthode de
Mobiletteil faut changer le type devehicule
public boolean accepterSiVespa(Vehicule vehicule) {
boolean accepter = false;
if(vehicule instanceof Mobilette){
Mobilette mobilette = (Mobilette) vehicule;
accepter = mobilette.marqueDeMobilette().equals("Vespa");
}
return accepter;
}
-
Avant d’accéder à la méthode
marqueDeMobiletteon change le type versMobilette -
L’opérateur est
(Mobilette), ou en général:(NOUVEAU_TYPE) -
On pourrait aussi écrire, sur une ligne:
accepter = ((Mobilette) vehicule).marqueDeMobilette().equals("Vespa");
- À noter qu’un transtypage erroné va provoquer une erreur d’exécution:
((Moto) vehicule).nombreDeRoues(); // si vehicule n'est pas une Moto
((Chat) vehicule).nombreDeRoues();