Académique Documents
Professionnel Documents
Culture Documents
et Polymorphisme
Philippe Genoud
dernière mise à jour : lundi 11 janvier 2021
©
© Philippe
Philippe GENOUD
GENOUD UGA
UJF Décembre
Janvier 2021
2009 1
Surclassement
La réutilisation du code est un aspect important de l'héritage, mais ce n'est peut être pas le plus important
Le deuxième point fondamental est la relation qui relie une classe à sa super-classe :
Ensemble des
objets Etudiant
Etudiant
Un EtudiantSportif est un Etudiant
objet
Etudiant
L’ensemble des étudiants sportifs est qui n’est pas
sportif
EtudiantSportif inclus dans l’ensemble des étudiants
à une référence déclarée de type A il est possible d'affecter une valeur qui est une référence vers un
objet de type B (surclassement ou upcasting)
Etudiant
Etudiant e;
e = new EtudiantSportif(...);
EtudiantSportif
A C c;
c = new D();
plus généralement à une référence d'un type donné, il est B C c = new E();
possible d'affecter une valeur qui correspond à une c = new F();
référence vers un objet dont le type effectif est n'importe D E c = new A();
quelle sous-classe directe ou indirecte du type de la c = new B();
F
référence
© Philippe GENOUD UGA Janvier 2021 3
Surclassement
Lorsqu'unobjet est "sur-classé" il est vu par le compilateur comme un objet du type de la
référence utilisée pour le désigner.
Ses fonctionnalités sont alors restreintes à celles proposées
par la classe du type de la référence. Etudiant
String nom;
EtudiantSportif es = String prénom;
new EtudiantSportif("DUPONT","Jean", int age;
25,..,"Badminton",..); ...
es public Etudiant(String n, String p, int a)
isa
Etudiant e; public void affiche()
e = es; // upcasting DUPONT public int nbInscriptions()
...
Jean
e.affiche(); 25
e
es.affiche();
...
System.out.println(e.nbInscriptions()); Badminton EtudiantSportif
System.out.println(es.nbInscriptions()); ...
String sportPratiqué;
System.out.println(es.bonusSportif()); ...
Etudiant
Etudiant e = new EtudiantSportif(
public void affiche() {
"DUPONT","Jean",25,.., System.out.println(
"Badminton",..); "Nom : "+nom+"\n" Que va donner
"Prénom : "+prénom+"\n"
"Age : "+age+ ...); e.affiche() ?
e isa
} ?
DUPONT
Jean e.affiche();
25
EtudiantSportif
...
?
Badminton
public void affiche() {
... super.affiche();
System.out.println(
"Sport" : "+sport+"\n"
+ ...);
}
Etudiant
Etudiant e = new EtudiantSportif(
Lorsqu'une méthode d'un objet est accédée
public void affiche() {
"DUPONT","Jean",25,.., System.out.println(
au travers d'une référence "surclassée",
"Badminton",..); "Nom : "+nom+"\n" c'est la méthode telle qu'elle est définie
"Prénom : "+prénom+"\n"
"Age : "+age+ ...);
au niveau de la classe effective de
e isa
} ? qui est en fait invoquée et exécutée
l'objet
DUPONT
Jean e.affiche();
25
EtudiantSportif
...
? Nom : DUPONT
Badminton
public void affiche() { Prénom : Jean
... super.affiche();
System.out.println( Age : 25
"Sport" : "+sport+"\n" …
+ ...); Sport : Badminton
}
Ce mécanisme est désigné sous le terme de lien-dynamique (dynamic binding, late-binding ou run-time binding)
© Philippe GENOUD UGA Janvier 2021 7
Lien dynamique Vérifications statiques
A la compilation: seules des vérifications statiques qui se basent sur le type déclaré de l’objet
(de la référence) sont effectuées
la classe déclarée de l’objet recevant un message doit posséder une méthode dont la signature correspond
à la méthode appelée.
A obj = new B(); B est un sous type de A (upcasting)
public class A {
public void m1() { Type déclaré obj.m1(); m1 est bien définie pour le type A
garantit
dès la compilation que les messages pourront être résolus au moment de l’exécution
robustesse du code
© Philippe GENOUD UGA Janvier 2021 8
Lien dynamique Vérifications statiques
vérifications
statiques: garantissent dès la compilation que les messages pourront être résolus
au moment de l’exécution
à la compilation il n’est pas toujours possible de déterminer le type exact de l'objet récepteur d'un message
Le
terme polymorphisme (du grec πολύμορφος , « multiforme ») décrit la caractéristique d'un élément qui
peut se présenter sous différentes formes.
le fait que la même opération puisse se comporter différemment sur différentes classes de la hiérarchie.
"Lepolymorphisme constitue la troisième caractéristique essentielle d'un langage orienté objet après
l'abstraction des données (encapsulation) et l'héritage"
https://archive.org/details/TIJ4CcR1/page/n3
Bruce Eckel - "Thinking in JAVA"
4th Edition – 2006
https://archive.org/details/TIJ4CcR1/page/n3
}
Type déclaré
ClasseA refA = new ClasseA();
ClasseC.methodX(refA); param TypeA
ClasseB refB = new ClasseB();
ClasseC.methodX(refB); param TypeB
refA = refB; // upCasting
ClasseC.methodX(refA); param
?????TypeA
Le choix de la méthode à exécuter est effectué à la compilation en fonction des types déclarés : Sélection statique
© Philippe GENOUD UGA Janvier 2021 16
Surcharge et polymorphisme
public class ClasseA {
@Override
public String toString() {
ClasseC c = new ClasseD();
return "je suis un A";
}
} ClasseB refB = new ClasseB();
private double x;
private double y;
...
...
...
private double x;
private double y;
...
javac Existe-t-il une méthode equals(Object) dans la classe du
récepteur du message ?
public boolean equals(Point pt) {
return this.x == pt.x && this.y == pt.y;
}
}
private double x;
private double y;
...
javac Existe-t-il une méthode equals(Object) dans la classe du
récepteur du message ?
public boolean equals(Point pt) { Oui : cette méthode est héritée de Object
return this.x == pt.x && this.y == pt.y;
} a Invokevirtual equals(Object)
}
...
javac Existe-t-il une méthode equals(Object) dans la classe du
récepteur du message ?
public boolean equals(Point pt) { Oui : cette méthode est héritée de Object
return this.x == pt.x && this.y == pt.y;
} a Invokevirtual equals(Object)
}
java
o.equals(p1) -->
--> false
true
B b = c; Incompatible types
Un C n'est pas un B
Incompatible types
E e = c; Un C n'est pas forcément un E