Académique Documents
Professionnel Documents
Culture Documents
et Polymorphisme
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 :
Etudiant
Un EtudiantSportif est un Etudiant
1
Surclassement
Tout objet instance de la classe B peut être aussi vu comme une instance de
la classe A.
Etudiant
Etudiant e;
e = new EtudiantSportif(...);
EtudiantSportif
Surclassement
Lorsqu'un objet est « sur-classé », il est vu 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;
es = new EtudiantSportif("DUPONT","Jean", int age;
25,..,"Badminton",..); …
public Etudiant(String n, String p,int a ...)
es public void affiche()
Etudiant e;
public int nbInscriptions()
e = es; // upcasting ...
e
e.affiche();
es.affiche(); isa
DUPONT EtudiantSportif
e.nbInscriptions();
es.nbInscriptions(); Jean
String sportPratiqué;
25 …
es.bonusSportif(); ... public EtudiantSportif (String n, String p,
e.bonusSportif(); Badminton int a, …, String s, ...)
public void affiche()
Le compilateur refuse ce ...
public double bonusSportif()
message : pas de méthode
...
bonusSportif définie dans la
classe Etudiant
© Sofia ZAIDENBERG CNRS Octobre 2007 4
2
Lien dynamique
Résolution
Résolution des
des messages
messages
isa ?
EtudiantSportif
DUPONT
Jean public void affiche()
{
25 super.affiche();
... System.out.println(
"Sport" : "+sport+"\n"
Badminton + ...);
... }
Lien dynamique
Résolution
Résolution des
des messages
messages
isa
DUPONT ? EtudiantSportif
Nom : DUPONT public void affiche()
Jean
Prénom : Jean {
25 Age : 25 super.affiche();
... … System.out.println(
Sport : Badminton "Sport" : "+sport+"\n"
Badminton + ...);
... }
3
Lien dynamique
Mécanisme
Mécanisme de
de résolution
résolution des
des messages
messages
Lien dynamique
Vérifications
Vérifications statiques
statiques
public class A {
A obj = new B();
public void m1() { Type obj.m1();
System.out.println("m1 de A"); déclaré obj
} obj.m2();
}
Test.java:21: cannot resolve symbol
public class B extends A { symbol : method m2 ()
public void m1() {
location: class A
System.out.println("m1 de B");
} obj.m2();
public void m2() { ^
System.out.println("m2 de B"); 1 error
}
}
4
Lien dynamique
Vérifications
Vérifications statiques
statiques
public class A {
A obj;
A obj = new B();
for (int i = 0; i < 10; i++)
public void m1() { Type obj.m1();
System.out.println("m1 de A"); déclaré obj {
} obj.m2();
hasard = Math.random()
}
if ( hasard < 0.5)
Test.java:21: cannot resolve symbol
public class B extends A { obj = new A();
symbol : method m2 ()
public void m1() { else
location: class A
System.out.println("m1 de B");
}
obj = new B();
obj.m2();
public void m2() { ^
System.out.println("m2 de B"); 1obj.m1();
error
}
} }
Vérification statique : garantit dès la compilation que les messages pourront être
résolus au moment de l’exécution
Lien dynamique
Choix
Choix des
des méthodes,
méthodes, sélection
sélection du
du code
code
5
Polymorphisme
À quoi servent l’upcasting et le lien dynamique ?
À la mise en œuvre du polymorphisme
Polymorphisme
ClasseA
méthodeX()
ClasseB ClasseC
méthodeX()
Surclassement
ClasseA objA; La référence peut
désigner des objets de
classe différente
Un cas particulier de
objA = ... (n’importe quelle sous polymorphisme
classe de ClasseA)
objA.methodeX();
+ Manipulation uniforme des
objets de plusieurs classes
Lien dynamique par l'intermédiaire d'une
Le comportement est
différent selon la classe classe de base commune
effective de l’objet
6
Polymorphisme
liste peut contenir des étudiants de n’importe quel type
GroupeTD td1 = new GroupeTD();
td1.ajouter(new Etudiant("DUPONT", …)); public class GroupeTD{
Etudiant[] liste = new Etudiant[30];
td1.ajouter(new EtudiantSportif("BIDULE",
"Louis", … , "ski alpin"); int nbEtudiants = 0;
...
public void ajouter(Etudiant e)
{
Etudiant if (nbEtudiants < liste.lenght)
liste[nbEtudiants++] = e;
public void affiche()
{
}
System.out.println( public void afficherListe()
"Nom : "+nom+"\n" {
"Prénom : "+prénom+"\n" for (int i=0;i<nbEtudiants; i++)
"Age : "+age+ ...); liste[i].affiche();
} }
}
Polymorphisme
7
Polymorphisme
Pour
Pour conclure
conclure
Surcharge et polymorphisme
public class ClasseC {
8
À propos de equals
Tester l’égalité de deux objets de la même classe
public class Object {
... De manière générale, il vaut mieux
public boolean equals(Object o) éviter de surcharger des méthodes
return (this == o); en spécialisant les arguments
}
...
}
public boolean equals(Point pt) {
return (this.x == pt.x && this.y == pt.y);
public class Point {
}
private double x;
surcharge (overloads) la méthode
private double y;
equals(Object o) héritée de Object
...
Point p1 = new Point(15,11);
} Point p2 = new Point(15,11);
p1.equals(p2) --> true
Object o = p2;
invokevirtual … <Method equals(Object)> p1.equals(o) --> false
Le choix de la méthode à exécuter est effectué o.equals(p1) --> false
statiquement à la compilation
en fonction du type déclaré de l’objet récepteur
du message et du type déclaré du (des)
paramètre(s)
A propos de equals
Tester l’égalité de deux objets de la même classe
public class Object {
...
public boolean equals(Object o)
public boolean equals(Object o) {
return this == o
} if (! (o instanceof Point))
... return false;
}
public boolean
Point equals(Point
pt = (Point) pt) {
o; // downcasting
return
returnthis.x == ==
(this.x pt.x && &&
pto.x this.y == ==
this.y pt.y;
pto.y);
public class Point {
}
}
private double x;
Redéfinir (« override ») la méthode
private double y; equals(Object o) héritée de Object
...
Point p1 = new Point(15,11);
} Point p2 = new Point(15,11);
p1.equals(p2) -->
--> true
true
Object o = p2;
p1.equals(o) -->
--> false
true
o.equals(p1) -->
--> false
true
9
Downcasting
ClasseX obj = …
ClasseA a = (ClasseA) obj;
java.lang.ClassCastException: ClasseX
at Test.main(Test.java:52)
Héritage et abstraction
classes
classes abstraites
abstraites
10
Classes Abstraites
Exemple
Exemple introductif
introductif
Un grand classique les formes géométriques
On veut définir une application permettant de manipuler des formes
géométriques (triangles, rectangles, cercles…).
Chaque forme est définie par sa position dans le plan
Factoriser le code ?
Classes abstraites
Exemple
Exemple introductif
introductif
largeur
v2
r
hauteur
x,y
x,y v1
x,y
class Forme {
11
Classes abstraites
Exemple
Exemple introductif
introductif
public class ListeDeFormes {
public static final int NB_MAX = 30; On veut pouvoir
private Forme[] tabForme = new Forme[NB_MAX]; gérer des listes
private int nbFormes = 0;
de formes
public void ajouter(Forme f)
{
if (nbFormes < NB_MAX) On exploite le polymorphisme :
tabForme[nbFormes++] = f la prise en compte de nouveaux
} types de forme ne modifie pas le code
public void toutDeplacer(double dx,double dy)
{
for (int i=0; i < NbFormes; i++) Appel non valide car la méthode
tabFrome[i].deplace(dx,dy); périmètre n’est pas implémentée
}
au niveau de la classe Forme
public double périmetreTotal()
{
double pt = 0.0; Définir une méthode
for (int i=0; i < NbFormes++; i++) périmètre dans Forme ?
pt += tabForme[i].périmetre();
return pt; public double périmetre()
} {
return 0.0; // ou -1. ??
}
Classes abstraites
Utilité :
Définir des concepts incomplets qui devront être implémentés dans les
sous classes
Factoriser le code
public abstract
class Forme {
Classe abstraite
protected double x,y;
12
Classes abstraites
Classe abstraite : classe non instanciable, c'est-à-dire qu'elle n'admet
pas d'instances directes.
Impossible de faire new ClasseAbstraite(…);
Une classe dans laquelle au moins une opération abstraite est déclarée,
est une classe abstraite (l'inverse n'est pas vrai).
Les
opérations abstraites sont particulièrement utiles pour mettre en
œuvre le polymorphisme.
L'utilisation du nom d'une classe abstraite comme type pour une (des)
référence(s) est toujours possible (et souvent souhaitable !!!)
Classes abstraites
Une
classe abstraite permet de regrouper certaines caractéristiques
communes à ses sous-classes et définit un comportement minimal
commun.
13
Classes abstraites
Mieux structurer avec des classes et des opérations abstraites
Classes abstraites
public abstract class Magnitude {
14
Héritage et abstraction
interfaces
interfaces
Interfaces
Bill Venners Designing with Interfaces
One Programmer's Struggle to Understand the Interfaces
Exemple
Exemple introductif
introductif
http://www.atrima.com/designtechniques/index.html
class Dog extends Animal { class Bird extends Animal { class Cat extends Animal {
... ... ...
void talk() { void talk() { void talk() {
System.out.println("Woof!"); System.out.println("Tweet"); System.out.println("Meow");
} } }
} } }
15
Interfaces
Exemple
Exemple introductif
introductif
Comment utiliser Interrogator pour faire parler aussi un CuckooClock ?
Faire rentrer
CuckooClock dans la
hiérarchie Animal ?
abstract class Animal {
class Clock {
abstract void talk();
} ... Pas d’héritage multiple
}
Se passer du
polymorphisme ?
Interfaces
Exemple
Exemple introductif
introductif
abstract class Animal implements Talkative {
class Clock {
abstract void talk();
} ...
}
Association de ce type à
différentes classes de la
hiérarchie d’héritage
class Dog extends Animal { class CuckooClock extends Clock
{ implements Talkative
void talk() { class Bird extends Animal {
public void talk() {
System.out.println("Woof!");
} void talk() { class Cat extends Animal { System.out.println("Cuckoo,
} System.out.println("Tweet"); cuckoo!");
} void talk() {
}
} System.out.println("Meow.");
} }
}
Talkative subject) {
static void makeItTalk(Animal public void talk();
subject.talk(); }
}
}
Définition d’un type
Utilisation de ce type abstrait abstrait (interface)
16
Interfaces
« Java's interface gives you more polymorphism than you
can get with singly inherited families of classes, without the
« burden » of multiple inheritance of implementation. »
Bill Venners Designing with Interfaces - One Programmer's Struggle to
Understand the Interface
http://www.atrima.com/designtechniques/index.html
Interfaces
Déclaration
Déclaration d’une
d’une interface
interface
Une interface est une collection d'opérations utilisée pour spécifier un
service offert par une classe.
Une interface peut être vue comme une classe abstraite sans attributs et
dont toutes les opérations sont abstraites.
•Toutes les méthodes sont abstraites
import java.awt.*; •Elles sont implicitement publiques
public interface Dessinable {
• Possibilité de définir des attributs à
public void dessiner(Graphics g); condition qu’il s’agisse d’attributs de
void effacer(Graphics g); type primitif
} • Ces attributs sont implicitement
déclarés comme static final
Dessinable.java
«interface»
interface
Dessinable
opérations abstraites dessiner(g : Graphics)
effacer(g: Graphics)
17
Interfaces
«« Réalisation
Réalisation »» d’une
d’une interface
interface
Une interface est destinée à être « réalisée » (implémentée) par d’autres
classes (celles-ci en héritent toutes les descriptions et concrétisent les
opérations abstraites).
Forme
Les classes réalisantes s'engagent à
double x,y;
fournir le service spécifié par l'interface double surface()
double périmètre()
L’implémentation d’une interface << interface >> deplacer(double dx, double dy)
Dessinable
est libre. dessiner(Graphics g)
effacer(Graphics g)
Rectangle
Clock
double largeur, hauteur;
…
double surface()
double périmètre()
… String txt;
RectangleDessinable
dessiner(Graphics g) int x,y;
effacer(Graphics g); Font f; ... opérations Color c
… … concrétisées
dessiner(Graphics g) dessiner(Graphics g)
effacer(Graphics g); effacer(Graphics g)
Interfaces
«« Réalisation
Réalisation »» d’une
d’une interface
interface
De la même manière qu'une classe étend sa super-classe, elle peut de manière
optionnelle implémenter une ou plusieurs interfaces
Dans la définition de la classe, après la clause extends nomSuperClasse, faire
apparaître explicitement le mot clé implements suivi du nom de l'interface
implémentée
Si la classe est une classe concrète, elle doit fournir une implémentation (un corps)
à chacune des méthodes abstraites définies dans l'interface (qui doivent être
déclarées publiques)
18
Interfaces
«« Réalisation
Réalisation »» d’une
d’une interface
interface
Une classe JAVA peut implémenter simultanément plusieurs interfaces
Pour cela la liste des noms des interfaces à implémenter séparés par des virgules doit
suivre le mot clé implements
Interfaces
Interface
Interface et
et polymorphisme
polymorphisme
Une interface peut être utilisée comme un type
À des variables (références) dont le type est une interface il est possible
d'affecter des instances de toute classe implémentant l'interface, ou toute
sous-classe d'une telle classe.
public class Fenetre { Dessinable d;
private nbFigures; ..
private Dessinable[] figures; d = new RectangleDessinable(…);
... ...
public void ajouter(Dessinable d){ d.dessiner(g);
... d.surface();
}
public void supprimer(Dessinable o){
... Permet de s’intéresser uniquement à
} certaines caractéristiques d’un objet
19
Interfaces
Héritage
Héritage d’interface
d’interface
De la même manière qu'une classe peut avoir des sous-classes, une interface
peut avoir des « sous-interfaces »
Une sous-interface
Hérite de toutes les méthodes abstraites et des constantes de sa « super-
interface »
Peut définir de nouvelles constantes et méthodes abstraites
Une classe qui implémente une interface doit implémenter toutes les méthodes
abstraites définies dans l'interface et dans les interfaces dont elle hérite.
Clock
…
CuckooClock TexteDessinable
… String txt;
dessiner(Graphics g) int x,y;
effacer(Graphics g); Font f; ...
… …
dessiner(Graphics g)
effacer(Graphics g);
20
Evolution des interfaces
Clock
…
1ère solution :
Modifier le code de toutes les
CuckooClock TexteDessinable
classes implé
implémentant l'interface
… String txt; (encore faut-
faut-il le pouvoir)
dessiner(Graphics g) int x,y;
effacer(Graphics g); Font f; ...
setColor(
(Color c)
setColor… …
dessiner(Graphics g)
effacer(Graphics g);
setColor(
setColor(Color c)
Ces classes n'implé
n'implémentent plus l'interface
© Sofia ZAIDENBERG CNRS Octobre 2007 41
Clock
… <<interface>>
DessinableColoriable
setColor(Color c)
CuckooClock TexteDessinable
String txt;
2ème solution :
…
dessiner(Graphics g) int x,y;
effacer(Graphics g); Font f; ... Définir une sous interface
… …
dessiner(Graphics g)
effacer(Graphics g);
21
Interfaces
héritage
héritage d’interfaces
d’interfaces
boolean isOpen()
void close()
Représente une connexion ouverte vers une entité
telle qu’un dispositif hardware, un fichier, une
« socket » réseau, ou tout composant logiciel
capable de réaliser une ou plusieurs opérations
d’entrée/sortie.
<< interface >> << interface >>
ReadableByteChanel WritableByteChanel
package java.nio;
interface ByteChannel extends ReadableByteChanel, WriteableByteChanel {
}
Interfaces
Intérêt
Intérêt
22
Interfaces
Intérêt
Intérêt
« Smarter Java development » Michael Cymerman , javaworld aout 99.
http://www.javaworld.com
By incorporating interfaces into your next project, you will notice benefits
throughout the lifecycle of your development effort. The technique of coding to
interfaces rather than objects will improve the efficiency of the development
team by:
23