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
Vehicule
est unVehicule
- un objet
DeuxRoues
est unVehicule
- un objet
Moto
est unVehicule
- un objet
Mobilette
est 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
vehicule
est de typeVehicule
, on peut seulement accéder- aux méthodes définies dans la classe
Vehicule
- même si la méthode
accepterSiDeuxRoues
avait été appelée comme suit:
- aux méthodes définies dans la classe
accepterSiDeuxRoues(new Mobilette());
- c-à-d même si l’objet
vehicule
est 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
instanceof
vérifie le type réel de l’objetvehicule
, ici:- retourne vrai si
vehicule
est 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
Mobilette
il 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
marqueDeMobilette
on 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();