Escolar Documentos
Profissional Documentos
Cultura Documentos
Polymorphisme Classes abstraites Interfaces Rutiliser des classes Mcanisme de la liaison retarde
R. Grin Java : hritage et polymorphisme 2
Rutilisation
Hritage
Pour raccourcir les temps dcriture et de mise au point du code dune application, il est intressant de pouvoir rutiliser du code dj utilis
R. Grin
R. Grin
R. Grin
R. Grin
qui se comporte dans les grandes lignes comme la classe A mais avec quelques diffrences sans toucher ni copier le code source de A On a seulement besoin du code compil de A
R. Grin Java : hritage et polymorphisme 8
Vocabulaire
La classe B qui hrite de la classe A sappelle une classe fille ou sous-classe La classe A sappelle une classe mre, classe parente ou super-classe
R. Grin
R. Grin
10
R. Grin
Exemples dhritages
Classe mre Vehicule, classes filles Velo, Voiture et Camion Classe Avion, classes mres ObjetVolant et
Quand on crit la classe RectangleColore, on doit seulement crire le code (variables ou mthodes) li aux nouvelles possibilits ; on ajoute ainsi une variable couleur et les mthodes qui y sont lies redfinir certaines mthodes ; on redfinit la mthode dessineToi()
Java : hritage et polymorphisme 13
ObjetMotorise
R. Grin
R. Grin
14
Chaque langage objet a ses particularits Par exemple, C++ et Eiffel permettent lhritage multiple ; C# et Java ne le permettent pas A partir de ce point on dcrit lhritage dans le langage Java
R. Grin
16
Lhritage en Java
En Java, chaque classe a une et une seule classe mre (pas dhritage multiple) dont elle hrite les variables et les mthodes Le mot clef extends indique la classe mre :
Exemples dhritages
class Voiture extends Vehicule class Velo extends Vehicule class VTT extends Velo class Employe extends Personne class ImageGIF extends Image class PointColore extends Point class Polygone extends FigureGeometrique
Par dfaut (pas de extends dans la dfinition dune classe), une classe hrite de la classe Object (tudie plus loin)
Java : hritage et polymorphisme 17
R. Grin
R. Grin
18
Types en Java
Le type dune variable dtermine les donnes que la variable peut contenir/rfrencer Le type dune expression dcrit la forme du rsultat du calcul de lexpression Par exemple, si x et y sont des int, x + y est de type int Les types en Java : types primitifs, tableaux, numrations et classes On verra aussi les interfaces et les types gnriques
Sous-type
B est un sous-type de A si on peut ranger une expression de type B dans une variable de type A
Les sous-classes dune classe A sont des soustypes de A En effet, si B hrite de A, tout B est un A donc on peut ranger un B dans une variable de type A Par exemple,
A a = new B();
est autoris
R. Grin Java : hritage et polymorphisme 22
La premire instruction dun constructeur peut tre un appel un constructeur de la classe mre : super(...)
ou un autre constructeur de la classe : this(...) Interdit de placer this() ou super() ailleurs quen premire instruction dun constructeur
R. Grin Java : hritage et polymorphisme 25
R. Grin
26
Si la premire instruction dun constructeur nest ni super(...), ni this(...), le compilateur ajoute au dbut un appel implicite super()au constructeur sans paramtre de la classe mre (erreur de compilation sil nexiste pas !) toujours excut avant les autres instructions du constructeur
Ce constructeur par dfaut nappelle pas explicitement un constructeur de la classe mre un appel du constructeur sans paramtre de la classe mre est automatiquement effectu
R. Grin
Question
R. Grin
this et constructeurs
this et constructeurs
Durant la redescente dans les constructeurs des classes anctres, le type de lobjet en cours de cration (this) est son type rel Cest utile de le savoir sil y a un appel polymorphe dans un des constructeurs ( viter !)
this existe ds que lobjet a t cr par le constructeur de la classe Object this nexiste pas avant, dans la remonte vers le constructeur de la classe Object Pratiquement, this existe au retour du premier appel super() ou this(), mais pas avant Ainsi this ne peut tre utilis (explicitement ou implicitement) dans les paramtres de super() ou de this() On ne peut donc pas faire un appel une mthode dinstance dans les arguments passs super() ou this()
Java : hritage et polymorphisme 39
R. Grin
R. Grin
40
Rsoudre ce problme
Si traitement est une mthode dinstance de la classe Classe, le code new Classe(traitement(), ) est interdit depuis une autre classe Exemple (calculePrix est une mthode dinstance de la classe Lot) :
new Lot(calculePrix(article), article);
Revoir la conception ; souvent la meilleure solution, mais a nest pas toujours possible : Ne pas mettre de constructeur de Lot qui ncessite la donne du prix du lot ; pas de variable prix dans Lot ; la mthode getPrix() calcule le prix quand on le demande Utiliser un autre constructeur et faire lappel la mthode dinstance dans le constructeur
this(article); // autre constructeur prix = calculePrix(article);
Utiliser une mthode static (pas dutilisation de this implicite dans les paramtres du constructeur) si cest un traitement qui nest pas li une instance particulire
R. Grin
41
R. Grin
42
2.
Initialisation des variables statiques, leur valeur par dfaut, puis aux valeurs donnes par le programmeur Excution des blocs initialiseurs statiques
3.
4. 5.
R. Grin Java : hritage et polymorphisme 43 R. Grin
Initialisation des variables dinstance la valeur par dfaut de leur type Appel du constructeur de la classe mre (explicite ou implicite) ; viter les appels de mthodes redfinies car les variables dinstances ne sont pas encore initialises dans les classes filles Initialisations des variables dinstances si elles sont initialises dans leur dclaration Excution des blocs initialiseurs dinstance (tudis
plus loin)
De quoi hrite une classe ? Accs aux membres hrits Protection protected
Si une classe B hrite de A (B extends A), elle hrite automatiquement et implicitement de tous les membres de la classe A Cependant la classe B peut ne pas avoir accs certains membres dont elle a implicitement hrit (par exemple, les membres private) Ces membres sont utiliss pour le bon fonctionnement de B, mais B ne peut pas les nommer ni les utiliser explicitement
R. Grin
Protection protected
protected joue sur laccessibilit des membres (variables ou mthodes) par les classes
Note : il est dconseill dutiliser des variables protected (voir suite de ce cours)
filles Les classes filles de A ont accs aux membres protected de la classe A ; les autres classes non filles de A ny ont pas accs
public class Poisson extends Animal { private int profondeurMax; public Poisson(String unNom, int uneProfondeur) { nom = unNom; // utilisation de nom profondeurMax = uneProfondeur; }
R. Grin
47
R. Grin
48
protected et paquetage
En plus, protected autorise lutilisation par les classes du mme paquetage que la classe o est dfini le membre ou le constructeur
b1.m (sous la forme m ou this.m) b2.m o b2 est une instance de B (la granularit de protection est la classe) ou dune sous-classe de B
R. Grin
49
R. Grin
Attention, protected joue donc sur laccessibilit par B du membre m hrit (B comme sous-classe de A) mais pas sur laccessibilit par B du membre m des instances de A (B comme cliente de A)
R. Grin
51
Du code de B peut accder un membre protected de A (mthode m() ci-dessous) dans une instance de B ou dune sous-classe C de B mais pas dune instance dune autre classe (par exemple, de la classe est A ou dune autre classe fille D de A) ; voici du code de la classe B :
A a = new B b = new C c = new D d = new a.m(); // b.m(); // c.m(); // d.m(); // A(); // A classe mre de B B(); C(); // C sous-classe de B D(); // D autre classe fille de A interdit autoris autoris interdit
Java : hritage et polymorphisme 53
Les diffrentes protections sont donc les suivantes (dans lordre croissant de protection) :
public protected package (protection par dfaut) private
R. Grin
protected et constructeur
Si un constructeur de A est dclar protected, ce constructeur peut tre appel depuis un constructeur d'une classe fille B par un appel super() mais B ne peut crer dinstance de A par new
A()
(sauf si B est dans le mme paquetage que A)
R. Grin
56
Classe Object
En Java, la racine de larbre dhritage des classes est la classe java.lang.Object La classe Object na pas de variable dinstance ni de variable de classe La classe Object fournit plusieurs mthodes qui sont hrites par toutes les classes sans exception Les plus couramment utilises sont les mthodes toString et equals
Classe Object
R. Grin
renvoie une description de lobjet sous la forme dune chane de caractres Elle est utile pendant la mise au point des programmes pour faire afficher ltat dun objet ; la description doit donc tre concise, mais prcise
R. Grin
10
Exemple
public class Livre { ... @Override public String toString() { return "Livre [titre=" + titre + ",auteur=" + auteur + ",nbPages=" + nbPages + "]"; } }
Richard Grin Classes et objets page 61
println et toString
Si p1 est un objet, System.out.println(p1) (ou System.out.print(p1)) affiche la chane de caractres p1.toString() o toString() est la mthode de la classe de p1 Il est ainsi facile dafficher une description des objets dun programme pendant la mise au point du programme
R. Grin
62
Oprateur + et toString
toString est utilise par loprateur + quand un des 2 oprandes est une String (concatnation de
chanes) :
Employe e1; . . . String s = "Employe numro " + 1 + ": " + e1;
La mthode equals de Object renvoie true si this rfrence le mme objet que obj Elle peut tre redfinie dans les classes pour lesquelles on veut une relation dgalit (dquivalence dirait-on en mathmatiques) autre que celle qui correspond lidentit des objets
R. Grin
63
Problme frquent
Table de hachage
Structure de donnes qui permet de retrouver trs rapidement un objet si on connat sa cl En interne laccs aux objets utilise un tableau et une fonction de hachage applique la cl
Dessin rcupr sur Wikipedia
Rechercher des informations en connaissant une cl qui les identifie Par exemple, chercher les informations sur lemploy qui a le matricule AF823 Une table de hachage permet dimplmenter cette fonctionnalit
Fonction de hachage
R. Grin
65
R. Grin
Java : collections
66
11
hashCode
criture de hashCode
La valeur calcule doit ne pas tre trop longue calculer ne pas avoir trop de valeurs calcules gales, pour ne pas nuire aux performances des tables de hachage qui utilisent ces valeurs renvoyer la mme valeur pour 2 objets qui sont gaux au sens de equals Il ny a pas de formule universelle et il est souvent difficile de trouver une bonne mthode hashCode
R. Grin Java : hritage et polymorphisme 70
comme fonction de hachage par les tables de hachage fournies par le JDK La spcification de Java prcise que 2 objets gaux au sens de equals doivent renvoyer le mme entier pour hashCode Toute classe qui redfinit equals doit donc redfinir hashCode
R. Grin Java : hritage et polymorphisme 69
R. Grin
72
12
Exemple de hashCode
Exemple de hashCode
Types possibles des valeurs significatives : type primitif tableau classe Si le type est une classe qui a une mthode hashcode (on suppose quelle est correcte), utiliser la valeur renvoye par cette mthode Les transparents suivants expliquent quelles valeurs prendre pour les types primitifs et les tableaux
Java : hritage et polymorphisme 74
Il faut alors trouver partir des valeurs significatives une formule qui donne le plus de valeurs distinctes de hashcode pour des objets distincts Voici une recette (cite par le livre Effective Java ) qui montre comment combiner des valeurs significatives pour obtenir un hashcode
Java : hritage et polymorphisme 73
R. Grin
R. Grin
java.util.Arrays.hashcode(tableau)
Il reste combiner itrativement les valeurs obtenues pour toutes les valeurs significatives par la formule magique (voir livre Effective Java pour explications) suivante :
commencer par initialiser la variable resultat 17 (la variable qui contiendra le hashcode) puis boucler sur toutes les valeurs trouves pour chacun des champs significatifs, en calculant
31 * resultat + <valeur>
ssi
R. Grin
77
R. Grin
a*d = b*c
78
13
Exemple de hashCode
/* Rduit la fraction et applique la recette */ @Override public int hashCode() { Fraction f = reduire(); return 31 * (31 * 17 + f.num) + f.den; } }
R. Grin
79
R. Grin
80
Une recette simplissime qui peut convenir sil les performances ne sont pas critiques pour la recherche dans la table de hachage (moins bonne rpartition des valeurs) : transformer tous les attributs en String, concatner et appliquer la mthode hashcode de la classe
String
renvoie la classe de lobjet (le type retour est un peu plus complexe comme on le verra dans le cours sur la gnricit) Une instance de la classe Class reprsente un type (classe, interface, type primitif, tableau, numration) utilis par lapplication
R. Grin Java : hritage et polymorphisme 82
R. Grin
81
R. Grin
83
R. Grin
84
14
instanceof
Pour tester si un objet o est de la mme classe que lobjet courant, il ne faut donc pas utiliser instanceof mais le code suivant :
if (o != null && o.getClass() == this.getClass())
null
R. Grin Java : hritage et polymorphisme 85 R. Grin Java : hritage et polymorphisme 86
88
Redfinition et surcharge
Ne pas confondre redfinition et surcharge des mthodes Une mthode redfinit une mthode hrite quand elle a la mme signature que lautre mthode Une mthode surcharge une mthode (hrite ou dfinie dans la mme classe) quand elle a le mme nom, mais pas la mme signature, que lautre mthode
Depuis Java 5 on peut annoter par @Override une mthode qui redfinit une mthode dune classe anctre, y compris une mthode abstraite (ou qui implmente une mthode dune interface depuis Java 6)
@Override public Dimension getPreferredSize() {
Utile pour la lisibilit et pour reprer des fautes de frappe dans le nom de la mthode : le compilateur envoie un message derreur si la mthode ne redfinit aucune mthode
Java : hritage et polymorphisme 89
R. Grin
15
Exemple de redfinition
Exemple de surcharge
public class Entier { private int i; public Entier(int i) { this.i = i; } @Override public boolean equals(Object o) { if (o == null || (o.getClass() != this.getClass())) return false; Peut-on enlever return i == ((Entier)o).i; } cette instruction if ? }
R. Grin Java : hritage et polymorphisme 91
public class Entier { private int i; public Entier(int i) { this.i = i; } public boolean equals(Entier e) { if (e == null) return false; return i == e.i; } }
Il faut redfinir la mthode equals et ne pas la surcharger (explications la fin de cette partie du cours)
R. Grin
92
super.
Soit une classe B qui hrite dune classe A Dans une mthode dinstance m de B, super. sert dsigner un membre de A En particulier, super.m() dsigne la mthode m de A qui est en train dtre redfinie dans B :
On ne peut remonter plus haut que la classe mre pour rcuprer une mthode redfinie :
pas de cast (ClasseAncetre)m() pas de super.super.m()
Polymorphisme
R. Grin
95
16
Une question
B hrite de A B redfinit une mthode m() de A Quelle mthode m est excute, celle de A ou celle de B ? a est une variable qui contient
Polymorphisme
Le polymorphisme est le fait quune mme criture peut correspondre diffrents appels de mthodes ; par exemple,
A a = x.f(); a.m();
f peut renvoyer une instance de A ou de nimporte quelle sous-classe de A
La mthode appele ne dpend que du type rel de lobjet rfrenc par a (B) et pas du type dclar de a (A). Cest la mthode m de B qui est excute
Java : hritage et polymorphisme 97
peut appeler la mthode m de A ou dune sousclasse de A (connue seulement lexcution) Ce concept est une notion fondamentale de la programmation objet, indispensable pour une utilisation efficace de lhritage
R. Grin Java : hritage et polymorphisme 98
R. Grin
Mcanisme du polymorphisme
Exemple de polymorphisme
public class Figure { public void dessineToi() { } Mthode vide } public class Rectangle extends Figure { public void dessineToi() { . . . } public class Cercle extends Figure { public void dessineToi() { . . . }
99 R. Grin Java : hritage et polymorphisme 100
Le polymorphisme est obtenu grce au late binding (liaison retarde) : la mthode qui sera excute est dtermine seulement lexcution, et pas ds la compilation (par le type rel de lobjet qui reoit le message, et pas par son type dclar)
R. Grin
figures[i].dessineToi()
R. Grin Java : hritage et polymorphisme 102
17
Utilisation du polymorphisme
Bien utilis, le polymorphisme vite les codes qui comportent de nombreux embranchements et tests ; sans polymorphisme, la mthode dessineToi aurait d scrire :
for (int i = 0; i < figures.length; i++) { if (figures[i] instanceof Rectangle) { . . . // dessin dun rectangle } else if (figures[i] instanceof Cercle) { . . . // dessin dun cercle } }
R. Grin
103
R. Grin
104
Extensibilit
En programmation objet, une application est dite extensible si on peut tendre ses fonctionnalits sans toucher au code source dj crit Cest possible en utilisant en particulier lhritage et le polymorphisme comme on vient de le voir
Affichage et polymorphisme
System.out.println(objet)
affiche une description de tout objet grce au polymorphisme Elle est en effet quivalente
System.out.println(objet.toString())
et grce au polymorphisme cest la mthode toString() de la classe de objet qui est excute
R. Grin Java : hritage et polymorphisme 108
18
R. Grin
109
A a;
on doit pouvoir ranger une instance de B dans la variable a, et toute expression o intervient la variable a doit pouvoir tre compile et excute si a contient la rfrence une instance de B
R. Grin Java : hritage et polymorphisme 111
Les transparents suivants tudient en toute logique les contraintes imposes aux mthodes redfinies dans le cas dun langage objet qui respecte le principe de base nonc dans le transparent prcdent On verra que Java est un peu plus restrictif que ne limposerait la pure logique
R. Grin
112
doit pouvoir fonctionner si on met dans a une instance de B : m mthode de B qui renvoie
une valeur de type R' A a = new B(); R r = a.m(); Quelle contrainte sur R et R' ?
Pour respecter le principe est-un , quels types R' et P' pourrait-on dclarer pour la mthode redfinie ?
Java : hritage et polymorphisme 113
R' doit tre affectable R : R' sous-type de R (on parle de covariance car B est aussi un sous-type de A) ou types primitifs affectables (short int par exemple)
Java : hritage et polymorphisme 114
R. Grin
R. Grin
19
Java ne sembarrassait pas de ces finesses Une mthode redfinie devait avoir (par dfinition) exactement la mme signature que la mthode quelle redfinissait (sinon, ctait une
surcharge et pas une redfinition)
Quelle contrainte sur P et P' ? P doit tre affectable P' (pas linverse !):
P' super-type de P (contravariance) ou types primitifs affectables
R. Grin Java : hritage et polymorphisme 115
Elle devait aussi avoir exactement le mme type retour (sinon, le compilateur envoyait un message
derreur)
R. Grin
116
Object clone()
peut tre redfinie en C clone() dans une sous-classe C de Object Pas de changement pour les paramtres (pas de contravariance)
R. Grin Java : hritage et polymorphisme 117
Vocabulaire
Classe (ou type) relle dun objet : classe du constructeur qui a cr lobjet Type dclar dun objet : type donn au moment de la dclaration de la variable qui contient une rfrence vers lobjet, ou du type retour de la mthode qui a renvoy lobjet
Transtypage (cast)
20
Syntaxe
Exemple :
Velo v = new Velo(); Vehicule v2 = (Vehicule) v;
R. Grin
122
Utilisation du UpCast
Il est souvent utilis pour profiter ensuite du polymorphisme :
Figure[] figures = new Figure[10]; // ou (Figure)new Cercle(p1, 15); figures[0] = new Cercle(p1, 15); . . . figures[i].dessineToi();
R. Grin
Utilisation du DownCast
Utilis pour appeler une mthode de la classe fille qui nexiste pas dans une classe anctre
Figure f1 = new Cercle(p, 10); . . . Point p1 = ((Cercle)f1).getCentre();
Parenthses obligatoires car . a une plus grande priorit que le cast
Downcast : un objet est considr comme tant dune classe fille de sa classe de dclaration Toujours accept par le compilateur Mais peut provoquer une erreur lexcution si lobjet nest pas du type de la classe fille Un downcast doit toujours tre explicite
R. Grin
125
R. Grin
126
21
ArrayList figures = new ArrayList(); figures.add(new Cercle(centre, rayon)); figures.add(new Rectangle(p1, p2));
. . .
// Le type retour dclar de get() est Object. Cast // ncessaire car dessineToi() pas une mthode de Object
((Figure)figures.get(i)).dessineToi();
. . .
R. Grin
127
R. Grin
128
R. Grin
130
on peut dsigner la mthode cache de Classe1 en prfixant par le nom de la classe : Classe1.m()
ou par un cast (x est une instance d'une classe fille de Classe1) : ((Classe1)x)m()
22
Complments : final, tableaux, appel dune mthode polymorphe dans le constructeur dune classe mre
R. Grin Java : hritage et polymorphisme 134
R. Grin
133
Tableaux et hritage
Les tableaux hritent de la classe Object Si une classe B hrite dune classe A, la classe des tableaux 1 dimension dinstances de B est une sous-classe de la classe des tableaux 1 dimension dinstances de A (idem pour toutes les
dimensions)
R. Grin
136
R. Grin
137
R. Grin
138
23
Tableaux et cast
Object[] to1 = new String[2]; String[] ts1 = (String[])to1;
pas derreur lexcution car to1 cr avec new String[..]
Object[] to2 = new Object[2]; to2 ne contient que des String to2[0] = "abc"; to2[1] = "cd"; mais ClassCastException ts1 = (String[])to2; lexcution car to2 cr avec
new Object[..]
Object o = (Object)ts1;
R. Grin
Exemple
class M { M() { m(); } void m() { ... } } F f = new F(5); class F extends M { private int i; F(int i) { super(); this.i = i; } void m() { System.out.print( "i de F = " + i); } }
R. Grin Java : hritage et polymorphisme 141 R. Grin Java : hritage et polymorphisme 142
Classe abstraite
affichera
i de F = 0 !
Mthode abstraite
Classe abstraite
Une classe doit tre dclare abstraite (abstract class) si elle contient une mthode abstraite Il est interdit de crer une instance dune classe abstraite
Une mthode est abstraite (modificateur abstract) lorsquon la dclare, sans donner son implmentation (pas daccolades mais un simple ; la suite de la signature de la mthode) :
public abstract int m(String s);
R. Grin
24
Complments
Si on veut empcher la cration dinstances dune classe on peut la dclarer abstraite mme si aucune de ses mthodes nest abstraite Une mthode static ne peut tre abstraite (car on ne peut redfinir une mthode static)
R. Grin
lireDonnees lira les informations sur les titres dont les noms sont passs en paramtre, et les renverra dans un format indpendant du site consult
Java : hritage et polymorphisme 147
R. Grin
Modle de conception
lit les donnes sur le site des Echos et les met sous un format standard manipulable par les autres mthodes de CentreInfoBourse
lireDonnees
Java : hritage et polymorphisme 149
Lexemple prcdent utilise le modle de conception (design pattern) patron de mthode (template method) : la classe mre dfinit la structure globale (le patron) dun algorithme (mthode calcule de la classe CentreInfoBourse) elle laisse aux classes filles le soin de dfinir des points bien prcis de lalgorithme (mthode lireDonnees)
Java : hritage et polymorphisme 150
R. Grin
R. Grin
25
Une interface est une classe purement abstraite dont toutes les mthodes sont abstraites et publiques
Interface
R. Grin
151
R. Grin
152
Exemples dinterfaces
public interface Figure { public abstract void dessineToi(); public abstract void deplaceToi(int x, int y); public abstract Position getPosition(); } public interface Comparable { /** renvoie vrai si this est plus grand que o */ boolean plusGrand(Object o); public abstract } peut tre implicite
R. Grin Java : hritage et polymorphisme 153 R. Grin
Une classe implmente une interface I si elle dclare implements I dans son en-tte
154
Exemple dimplmentation
public class Ville implements Comparable { private String nom; Exactement la mme signature private int nbHabitants; que dans linterface Comparable . . . public boolean plusGrand(Object objet) { if (! objet instanceof Ville) { throw new IllegalArgumentException(""); } return nbHabitants > ((Ville)objet).nbHabitants; } }
2 seuls cas possibles : soit la classe C implmente toutes les mthodes de I1 soit la classe C doit tre dclare abstract ; Les mthodes manquantes seront implmentes par les classes filles de C
Java : hritage et polymorphisme 155
R. Grin
R. Grin
156
26
Une classe peut implmenter une ou plusieurs interfaces (et hriter dune classe) :
public class CercleColore extends Cercle implements Figure, Coloriable {
R. Grin
Une interface peut avoir la mme accessibilit que les classes : public : utilisable de partout sinon : utilisable seulement dans le mme paquetage
Comparable v1;
indique que la variable v1 rfrencera des objets dont la classe implmentera linterface
Comparable
R. Grin Java : hritage et polymorphisme 159 R. Grin Java : hritage et polymorphisme 160
Interfaces et typage
Si une classe C implmente une interface I, le type C est un sous-type du type I : tout C peut tre considr comme un I On peut ainsi affecter une expression de type C une variable de type I Les interfaces shritent : si une classe C implmente une interface I, toutes les sousclasses de C limplmentent automatiquement (elles sont des sous-types de I)
R. Grin
162
27
instanceof
Polymorphisme et interfaces
public interface Figure { void dessineToi(); } public class Rectangle implements Figure { public void dessineToi() { . . . } public class Cercle implements Figure { public void dessineToi() { . . . }
R. Grin Java : hritage et polymorphisme 164
Si un objet o est une instance dune classe qui implmente une interface Interface,
o instanceof Interface
est vrai
R. Grin
163
Cast et interfaces
On peut toujours faire des casts (upcast et downcast) entre une classe et une interface quelle implmente (et un upcast dune interface vers la classe Object) :
public class Dessin { private Figure[] figures; . . . public void afficheToi() { for (int i = 0; i < nbFigures; i++) figures[i].dessineToi(); } . . . }
Comparable c1 = new Ville("Cannes", 200000); Comparable c2 = new Ville("Nice", 500000); . . . if (c1.plusGrand(c2)) // upcast Comparable Object
// downcast Comparable Ville
System.out.println(((Ville)c2).nbHabitant());
R. Grin Java : hritage et polymorphisme 165 R. Grin Java : hritage et polymorphisme 166
Plus on programme en Java, plus on dcouvre lintrt des interfaces Leurs utilisations sont trs nombreuses et varies Les transparents suivants prsentent les plus courantes
Faire du polymorphisme avec des objets dont les classes nappartiennent pas la mme hirarchie dhritage (linterface joue le rle de la
classe mre, avec upcast et downcast)
R. Grin
167
R. Grin
168
28
Une interface peut tre utilise pour reprsenter une mthode qui nest connue qu lexcution:
linterface contient cette mthode on appelle la mthode en envoyant le message correspondant une instance dont la classe implmente linterface
R. Grin
170
R. Grin
172
De plus, une interface peut tre implmente par de nombreuses classes, ce qui rendra vos classes plus rutilisables
R. Grin
174
29
Exemple typique
Code
Une classe mtier FTP est utilise par une interface graphique GUI Sil y a un problme pendant le transfert de donnes, FTP passe un message derreur GUI pour que lutilisateur puisse le lire
public class GUI { private FTP ftp; public GUI() { ftp = new FTP(); Comment ftp.setAfficheur(this); amliorer ? . . . public void affiche(String m) {...} public class FTP { private GUI gui; public void setAfficheur(GUI gui) { this.afficheur = gui; } La classe mtier FTP . . . ne pourra pas tre gui.affiche(message);
Java : hritage et polymorphisme
R. Grin
175
R. Grin
public class GUI implements Afficheur { private FTP ftp; public GUI() { ftp = new FTP(); ftp.setAfficheur(this); . . . public void affiche(String m) {...} public class FTP { private Afficheur afficheur; public void setAfficheur(Afficheur aff) { this.afficheur = afficheur; } . . . afficheur.affiche(message);
Java : hritage et polymorphisme 177
Maintenant les 2 classes GUI et FTP dpendent dune interface plus abstraite quelles Consquences :
R. Grin
Vrificateur interactif
Si un mot nest pas dans le dictionnaire, le vrificateur demande lutilisateur ce quil doit faire de ce mot : lajouter dans le dictionnaire lignorer le corriger par un mot donn par lutilisateur
R. Grin
180
30
Code de GUI
GUI contient une mthode corrige(String mot) qui affiche un mot inconnu lutilisateur
et renvoie le choix de lutilisateur Il passe au vrificateur le texte tap par lutilisateur et lui demande de le vrifier : Il contient ce code :
Verificateur v = new Verificateur(...); v.verifie(zoneTexte.getText(), this);
void verifie(Document doc, GUI client) { . . . if (! dico.isCorrect(mot)) { Correction corr = client.corrige(mot); // Analyse laction indique par // le client et agit en consquence . . . }
this permettra au vrificateur dappeler la mthode corrige pour les mots inconnus
Java : hritage et polymorphisme 181 R. Grin Java : hritage et polymorphisme 182
R. Grin
Solution
void verifie(Document doc, ? client) { . . . if (! dico.isCorrect(mot)) { Correction corr = client.corrige(mot); // Analyse laction indique par // le client et agit en consquence . . . }
On dclare que le client implmente linterface Correcteur qui contient une seule mthode
Correction corrige(String mot)
Dans la classe du client on implmente la mthode corrige Len-tte de GUI contiendra implements Correcteur
R. Grin Java : hritage et polymorphisme 183 R. Grin Java : hritage et polymorphisme 184
Interfaces et API
Soit une classe abstraite Figure dune API Une classe C extrieure lAPI ne pourra hriter de Figure et dune autre classe A Il vaut mieux ajouter dans lAPI une interface Figure implmente par la classe abstraite
Interfaces et API
Donc, pensez ajouter des interfaces dans les API que vous crivez
FigureAbstraite La classe C pourra ainsi implmenter Figure et hriter de lautre classe A, et ventuellement rutiliser FigureAbstraite par dlgation
R. Grin Java : hritage et polymorphisme 185 R. Grin Java : hritage et polymorphisme 186
31
Hritage dinterfaces
AbstractTableModel
Dans ce cas, linterface hrite de toutes les mthodes et constantes des interfaces mres
Java : hritage et polymorphisme 190
R. Grin
189
R. Grin
Hritage et interface
La notion dhritage est relative lhritage de comportement mais aussi de structure En effet, si B hrite de A, les instances de B vont rcuprer toutes les variables dinstance des instances de A (la structure de donnes) Cest souvent une mauvaise conception dhriter dune classe si on nutilise pas toutes ses variables La notion dinterface est uniquement relative au comportement
Hritage et interface
On peut dire que lorsquune classe hrite dune classe mre, elle hrite de son code et de son type Si elle implmente une interface, elle hrite de son type Hriter du code : viter la duplication de code Hriter du type : polymorphisme et souplesse du sous-typage
32
Rutilisation
Ville
private String nom private int nbHabitant
...
public boolean plugrand(Object)
R. Grin Java : hritage et polymorphisme 193 R. Grin Java : hritage et polymorphisme 194
Il pourrait aussi tre utilis comme moyen pratique de rutilisation de code. Par exemple, la classe ParalllpipdeRectangle pourrait hriter de la classe Rectangle en ajoutant une variable profondeur
C2 hrite de C1 C2 peut dlguer une instance de C1 une partie de la tche quelle doit accomplir
R. Grin Java : hritage et polymorphisme 196
R. Grin
195
Dlgation pure
Une mthode m2() de la classe C2 dlgue une partie de son travail un objet c1 de la classe C1 , cr par la mthode m2 :
public int m2() { cration dune instance de C1 C1 c1 = new C1(); utilisation de linstance r = c1.m1(); }
R. Grin
197
R. Grin
198
33
En UML
Si C1 dpend aussi de C2 :
Classe C2 Classe C1
utilisation de o1
R. Grin
199
R. Grin
200
En UML
Il y a une association entre la classe C2 et la classe C1 (trait plein) Lassociation est unidirectionnelle si C1 ne connat pas C2:
Types dassociation
Il peut y avoir plusieurs types dassociation selon quun objet dune classe peut tre associ un ou plusieurs objets de lautre classe (mutiplicit) ou selon le nombre de classes qui interviennent dans lassociation (arit) Ces notions seront tudies dans dautres cours de conception objet
Classe C2
Classe C1
R. Grin
201
R. Grin
202
Exemples de rutilisation
Le contour dune fentre dessine sur lcran est un rectangle Comment rutiliser les mthodes dune classe Rectangle (comme {get|set}Dimension()) dans la classe Fenetre ?
R. Grin
203
R. Grin
204
34
On hrite dune des classes, celle qui correspond le plus au critre est-un (Classe1 dans lexemple) et on utilise la dlgation pour utiliser le code des autres classes (Classe2 dans lexemple) :
class Classe extends Classe1 { private Classe2 o2; // Classe2 rutiliser // par dlgation
Pour pouvoir utiliser le polymorphisme avec les mthodes de Classe2, on peut crer une interface qui contient les mthodes de Classe2 sur lesquelles on veut faire du polymorphisme
(m21() et m22() dans cet exemple)
interface InterfaceClasse2 { public int m21(); public Object m22(); }
R. Grin
207
R. Grin
208
On peut alors faire du polymorphisme sur les mthodes m21() et m22() ; par exemple :
InterfaceClasse2[] t = new InterfaceClasse2[10]; t[0] = new Classe(); t[1] = new Classe2(); . . . for (int i=0; i < t.length; i++) { x += t[i].m21(); }
R. Grin
209
R. Grin
210
35
Inconvnients de lhritage
Statique : une classe ne peut hriter de classes diffrentes des moments diffrents Souvent difficile de changer une classe mre sans provoquer des problmes de compatibilit avec les classes filles (mauvaise encapsulation, en particulier si on a des variables protected) Pas possible dhriter dune classe final (comme la classe String) Pas dhritage multiple en Java
Avantages de lhritage
Facile utiliser, car cest un mcanisme de base du langage Java Souple, car on peut redfinir facilement les comportements hrits, pour les rutiliser ensuite Permet le polymorphisme (mais on peut aussi
R. Grin
Conclusion
Il est conseill dutiliser lhritage pour la traduction dune relation est-un statique (et avec hritage de la structure), mais dutiliser la composition et la dlgation dans les autres cas
Prcisions sur le mcanisme de la liaison retarde (late binding) complment rserv aux initis
R. Grin
213
R. Grin
214
Le problme :
R. Grin
36
Si le programme contient
int a, b; . . . c = Math.min(a, b); Le compilateur ne tient pas compte de la valeur de retour
Cest la premire mthode qui sera choisie par le compilateur Si le programme avait dclar int a; long b; , cest la deuxime qui aurait t choisie
R. Grin Java : hritage et polymorphisme 217
R. Grin
220
Classe ou interface T sous laquelle se fera la recherche de la mthode durant lexcution : le type dclar de objet
Signature de la mthode : celle de la mthode la plus spcifique de T qui peut convenir (selon les types dclars de x1 et x2) Type retour de la mthode Mode dinvocation
Le mode dinvocation de la mthode peut tre : non virtuel (mthode private ; pas de late binding) super (appel de type super.m() ) interface (objet est dclar du type dune interface) virtuel (tous les autres cas)
Java : hritage et polymorphisme 222
R. Grin
37
Un cas o il faut examiner cette condition : une mthode avec la protection paquetage est redfinie dans le paquetage avec la protection public
Java : hritage et polymorphisme 223
R. Grin
Classe T1
Classe T1
Classe T2
R. Grin Java : hritage et polymorphisme 225
Classe T2
R. Grin
lobjet qui le message est envoy les valeurs des arguments lespace ncessaire lexcution de la mthode (pour les variables locales, pour les appels dautres mthodes, )
R. Grin Java : hritage et polymorphisme 228
38
Et il aurait encore t prfrable dcrire (pour viter des problmes subtils avec des ventuelles sous-classes) :
if (o != null && o.getClass().equals(getClass())) return false; . . .
R. Grin
230
39