Vous êtes sur la page 1sur 118

Cours JAVA : Le polymorphisme en Java.

Version 3.01 Julien Sopena1


1 julien.sopena@lip6.fr quipe REGAL - INRIA Rocquencourt LIP6 - Universit Pierre et Marie Curie

Licence professionnelle DANT - 2012/2013

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

1 / 118

Grandes lignes du cours


Le polymorphisme impose Lhritage des limites lhritage Principes de lhritage Classes et mthodes Syntaxe de lhritage en Java abstraites Hritage et visibilit Principes des classes Hritage et construction abstraites La rednition Exemple de classe abstraite La covariance Interfaces Interdire lhritage Prambule et dnition Polymorphisme et hritage Dclaration et Principes du polymorphisme implmentation Protocoles et polymorphisme Polymorphisme dinterface Les protocoles standards Classe ou interface ? Downcasting : la n du Composition dinterfaces polymorphisme.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 2 / 118

Outline
Lhritage Principes de lhritage Syntaxe de lhritage en Java Hritage et visibilit Hritage et construction La rednition La covariance Interdire lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

3 / 118

Outline
Lhritage Principes de lhritage Syntaxe de lhritage en Java Hritage et visibilit Hritage et construction La rednition La covariance Interdire lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

4 / 118

Rappel principes de la POO

1. Encapsulation
Rapprochement des donnes (attributs) et traitements (mthodes) Protection de linformation (private et public)

2. Agrgation (et composition)


Classe A "A UN" Classe B A
...

B
...

3. Utilisation
Classe A "UTILISE" Classe B

A
...

B
...

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

5 / 118

Un nouveau principe POO : Hritage


Dnition Le terme hritage dsigne le principe selon lequel une classe peut hriter des caractristiques (attributs et mthodes) dautres classes. Soient deux classes A et B Relation dhritage : Classe B "EST UN" Classe A
A est la super-classe ou classe mre de B B est la sous-classe ou classe lle de A

Exercice : Hritage, Agrgation ou Utilisation ?


Cercle et Ellipse ? Salle de bains et Baignoire ? Piano et Joueur de piano ? Entier et Rel ? Personne, Enseignant et tudiant ?
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 6 / 118

Motivation pour un nouveau type de relation entre classes


Une classe dcrit les services (comportements et donnes) dun ensemble dindividus Exemple : la classe Animal (animation graphique)
Animal
+getNom(): String +manger(...): ... +dormir(...): ... +reproduire(...): ...

Problmes pour implmenter cette spcication : Elle est trop gnrale (exemple : manger( ) est trs dirent suivant les animaux) Il manque les services spciques certaines catgories danimaux (exemple : voler( ), nager( ), ...)
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 7 / 118

Les mauvaises solutions


1. Faire que la classe Animal puisse vraiment reprsenter tous les animaux
accrotre linterface publique (tous les services possibles de tous les animaux) ajouter des attributs boolens pour les catgories (isOiseau, isPoisson, ...) ou un attribut qui indique la catgorie tester les attributs pour savoir si on peut rpondre un message Exemple : Animal unChat = new Animal ("chat",...); (avec un attribut genreAnimal de type String dans la classe Animal) code trs complexe et non maintenable

2. Faire autant de classes quil existe despces animales


beaucoup de services vont tre trs similaires entre les classes beaucoup de factorisations perdues

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

8 / 118

Classication hirarchise
Animal Vertbr Mammifre Homme Chat Poisson Invertbr Reptile

Les sous-classes (spcialisations) de la classe Mammifre sont les classes Homme et Chat Les ascendants (gnralisations) de la classe Mammifre sont les classes Vertbr et Animal
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 9 / 118

Hritage
Une sous-classe hrite des services (comportements et donnes) de ses ascendants Pour factoriser au mieux la programmation, il sut de placer les services la bonne place dans la relation dhritage
setNom() getNom() Animal

remuerVertbres() Vertbr

Invertbr

allaiter()Mammifre

Poisson nager()

crire() Homme
J. Sopena (INRIA/UPMC)

Chat
Le polymorphisme en Java. 10 / 118

Hirarchie en Java
Une classe hrite toujours dune seule et unique classe (hritage simple versus hritage multiple) Cette classe est dite super-classe de la sous-classe Par dfaut, toute classe hrite de la classe Object qui est la racine unique de larbre dhritage

Object Animal Vertbr Mammifre


J. Sopena (INRIA/UPMC)

Question Invertbr

...

Poisson

Reptile
11 / 118

Le polymorphisme en Java.

Outline
Lhritage Principes de lhritage Syntaxe de lhritage en Java Hritage et visibilit Hritage et construction La rednition La covariance Interdire lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

12 / 118

Syntaxe
Pour indiquer quune classe hrite dune autre classe, on utilise le mot-cl extends.
p u b l i c class Appartement extends Logement

Important
La classe Appartement ainsi dnie possde toutes les caractristiques de la classe Logement (i.e., ses lments privs et publics).

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

13 / 118

Spcialisation

p u b l i c class Logement { f i n a l p u b l i c double s u r f a c e ; p u b l i c double p r i x ; public S t r i n g p r o p r i e t a i r e ; p r i v a t e boolean vendu ; }

p u b l i c class Appartement extends Logement { f i n a l public i n t etage ; p r i v a t e boolean c a v e ; }

Les attributs de la classe Appartement sont : surface, prix, proprietaire, vendu, etage et cave.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

14 / 118

Implmentation en Java
p u b l i c class Homme extends Mammifre { // a t t r i b u t s p r o p r e s aux hommes u n i q u e m e n t p r i v a t e boolean d r o i t i e r ; ... p u b l i c void c r i r e ( ) { i f d r o i t i e r { . . . } else { . . . } } }

Homme unHomme = new Homme ( . . . ) ; // a p p e l d un s e r v i c e p r o p r e aux hommes unHomme . c r i r e ( ) ; // a p p e l d un s e r v i c e commun aux v e r t b r s ( h r i t ) unHomme . r e m u e r V e r t b r e s ( ) ; // a p p e l d un s e r v i c e commun aux animaux ( h r i t ) unHomme . setNom ( "Adam" ) ;
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 15 / 118

Hritage de comportements
Durant lexcution, linstruction :
unHomme . setNom ( "Adam" ) ;

provoque : La recherche de setNom() dans la classe Homme Puisquelle nexiste pas, la recherche se poursuit en remontant larbre dhritage jusqu trouver Animal.setNom() Animal.setNom() est excute (dans le contexte de unHomme) Si la mthode Animal.setNom() ntait pas dnie, une erreur serait dtecte lorsque la classe Object serait atteinte

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

16 / 118

retenir : la classe Object

Important
En Java, toutes les classes hritent de la classe Object.

La dclaration
p u b l i c class A { . . . }

doit donc tre comprise comme


p u b l i c class A extends O b j e c t { . . . }

mme si on ne lcrit pas ainsi.


J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 17 / 118

retenir : le mot-cl super

retenir
Java fournit la rfrence super qui dsigne pour chaque classe, sa classe mre.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

18 / 118

Hritage dattributs
p u b l i c class Animal { // a t t r i b u t s p r o p r e s t o u s l e s animaux p r i v a t e S t r i n g nom ; . . . p u b l i c S t r i n g getNom ( ) { r e t u r n nom ; } p u b l i c void setNom ( S t r i n g n ) { nom = n ; } ... } p u b l i c class V e r t b r extends Animal { // a t t r i b u t s p r o p r e s aux V e r t b r s private int nbVertbres ; . . . p u b l i c void s e t N b V e r t b r e s ( i n t n ) { nbVertbres = n ; } p u b l i c void r e m u e r V e r t b r e s ( ) { System . o u t . p r i n t l n ( this.getNom() + " remue " + nbVertbres + " vertbres " ) ; } }
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 19 / 118

Hritage dattributs suite

p u b l i c class Homme extends Mammifre { // a t t r i b u t s p r o p r e s aux hommes u n i q u e m e n t p r i v a t e boolean d r o i t i e r ; ... p u b l i c Homme ( S t r i n g unNom , boolean d r o i t i e r ) { this.setNbVertebres(50) ; this.setNom(unNom) ; this . d r o i t i e r = d r o i t i e r ; } ... }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

20 / 118

Hritage dattributs n
Homme uneFemme = new Homme( " v e " , t r u e ) ;

uneFemme

ve true 50

uneFemme . r e m u e r V e r t b r e s ( ) ; System . o u t . p r i n t l n ( uneFemme . getNom ( ) ) ;

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

21 / 118

Outline
Lhritage Principes de lhritage Syntaxe de lhritage en Java Hritage et visibilit Hritage et construction La rednition La covariance Interdire lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

22 / 118

Hritage et encapsulation
Les membres (attributs et mthodes) dclars privs dans une classe ne sont pas visibles dans une sous-classe En dautres termes, lhritage nimplique pas la visibilit
p u b l i c class Homme extends Mammifre { // a t t r i b u t s p r o p r e s aux hommes u n i q u e m e n t p r i v a t e boolean d r o i t i e r ; ... p u b l i c Homme ( S t r i n g unNom , boolean d r o i t i e r ) { this . setNbVertebres (50); nom = unNom ; // e r r e u r this . d r o i t i e r = d r o i t i e r ; } ... }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

23 / 118

Visibilit
Le modicateur qui prcde chaque mthode (et attribut) dtermine sa visibilit :
private la classe elle-mme une sous-classe, paquetage = pas une sous-classe, paquetage = une sous-classe, paquetage = pas une sous-classe, paquetage = dfaut protected public

OUI NON NON NON NON

OUI OUI OUI NON NON

OUI OUI OUI OUI NON

OUI OUI OUI OUI OUI

Rappel
Les attributs doivent toujours tre dclars private

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

24 / 118

Outline
Lhritage Principes de lhritage Syntaxe de lhritage en Java Hritage et visibilit Hritage et construction La rednition La covariance Interdire lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

25 / 118

Instantiation des attributs hrits


p u b l i c class Homme extends Mammifre { // a t t r i b u t s p r o p r e s aux hommes u n i q u e m e n t p r i v a t e boolean d r o i t i e r ; ... p u b l i c Homme ( S t r i n g unNom , boolean d r o i t i e r ) { this.setNbVertbres(50) ; this.setNom(unNom) ; this . d r o i t i e r = d r o i t i e r ; } ... }

Problmes Obligation dintroduire des modicateurs telles que Vertbr.setNbVertbres() Redondance la super-classe Mammifre doit avoir un constructeur
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 26 / 118

Hritage et construction Correction


Pour initialiser les attributs hrits, le constructeur dune classe peut invoquer un des constructeurs de la classe mre laide du mot-cl super.
p u b l i c class Homme extends Mammifre { p r i v a t e s t a t i c f i n a l i n t NB_VERTEBRES = 5 0 ; p r i v a t e boolean d r o i t i e r ; p u b l i c Homme ( S t r i n g unNom , boolean d r o i t i e r , int nbVertbres ) { // s u p e r d o i t t r e l a p r e m i r e i n s t r u c t i o n super ( unNom , n b V e r t b r e s ) ; this . d r o i t i e r = d r o i t i e r ; } p u b l i c Homme ( S t r i n g unNom , boolean d r o i t i e r ) { t h i s ( unNom , d r o i t i e r , NB_VERTEBRES ) ; } }
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 27 / 118

Rgles dutilisation dun constructeur de la classe mre. Rgles


1. Lappel dun constructeur de la classe mre doit tre la premire instruction du constructeur de la classe lle. 2. Il nest pas possible dutiliser la fois un autre constructeur de la classe et un constructeur de sa classe mre dans la dnition dun de ses constructeurs.

p u b l i c class A { p u b l i c A( i n t x ) { super ( ) ; this ( ) ; } }


J. Sopena (INRIA/UPMC)

E T N

I D R

T
28 / 118

Le polymorphisme en Java.

Constructeur implicite
Si aucun constructeur de la classe ou de la super-classe nest invoqu explicitement, le compilateur ajoute un appel au constructeur sans argument de la super-classe
p u b l i c class B extends A { p u b l i c B( i n t x ) { // a p p e l s u p e r ( ) i m p l i c i t e this . x = x ; ... } }

Attention : Dans ce cas, le constructeur sans argument doit tre dni dans la super-classe

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

29 / 118

Constructeur implicite : exemple

p u b l i c class A { p u b l i c A ( ) { System . o u t . p r i n t l n ( "A" ) ; } } p u b l i c class B extends A { p u b l i c B ( ) { System . o u t . p r i n t l n ( "B" ) ; } }

Le ligne de code suivante :


B c = new B ( ) ;

produira lachage suivant :


java MonProg A B

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

30 / 118

Constructeur implicite : erreur frquente


Etape 2 : Puis, on ajoute un constructeur.
p u b l i c class A { public i n t x ; public A (int x) { this.x =x; } p u b l i c class B extends A { public i n t y ; public B ( i n t x , i n t y ) { this . x = x ; this . y = y ; } } } p u b l i c class B extends A { public i n t y ; public B ( i n t x , i n t y ) { this . x = x ; this . y = y ; } }
31 / 118

Etape 1 : Jusquici tout va bien.


p u b l i c class A { public i n t x ; }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

Constructeur implicite : erreur frquente


javac B.java B.java:3: cannot find symbol symbol : constructor A() location: class A public B ( int x , int y ) { ^ 1 error } p u b l i c class B extends A { public i n t y ; public B ( i n t x , i n t y ) { super() ; \\ A j o u t du c o m p i l a t e u r this . x = x ; this . y = y ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

32 / 118

Constructeur implicite : Solutions


Solution 1 : Ajout dun constructeur vide.
p u b l i c class A { public i n t x ; public A () {} public A ( i n t x ) { this . x = x ; } } p u b l i c class B extends A { public i n t y ; public B ( i n t x , i n t y ) { this . x = x ; this . y = y ; } }
J. Sopena (INRIA/UPMC)

Solution 2 : Appel explicite au super(int).


p u b l i c class A { public i n t x ; public A ( i n t x ) { this . x = x ; } } p u b l i c class B extends A { public i n t y ; public B ( i n t x , i n t y ) { super(x); this . y = y ; } }
33 / 118

Le polymorphisme en Java.

Constructeur dune classe drive


Un constructeur dune classe drive commence toujours : 1. soit par lappel explicite dun autre constructeur de la classe. 2. soit par lappel explicite ou implicite dun constructeur de la classe mre.

Corollaire
Comme tout objet drive (directement ou indirectement) de la classe Object : Tout constructeur commence par excuter le constructeur de lObject

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

34 / 118

Outline
Lhritage Principes de lhritage Syntaxe de lhritage en Java Hritage et visibilit Hritage et construction La rednition La covariance Interdire lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

35 / 118

Dnition de la rednition.
Dnition On appelle rednition (en anglais overriding ) dune mthode, la possibilit de dnir le comportement dune mthode selon le type dobjet linvoquant, i.e., de donner une nouvelle implmentation une mthode hrite sans changer sa signature.
p u b l i c class A { public i n t ... } f (int x) {

} p u b l i c class B e x t e n d A { public i n t ... } }


J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 36 / 118

f (int x)

La signature dune mthode Java

p u b l i c class Homme extends Mammifre { ... p u b l i c void dessiner () { System . o u t . p r i n t l n ( " G r i b o u i l l i s " ) ; } } p u b l i c class L e o n a r d extends Homme { ... p u b l i c void dessiner () { System . o u t . p r i n t l n ( " J o c o n d e " ) ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

37 / 118

Overloading vs Overriding

ATTENTION
Il ne faut pas confondre la rednition (en anglais overriding ) et la surcharge (en anglais overloading ) qui a t tudie dans le cours dintroduction et qui correspond la possibilit de dnir des comportements dirents pour la mme mthode selon les arguments passs en paramtres.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

38 / 118

Surcharge dune mthode rednie


On peut aussi surcharger une mthode rednie.
p u b l i c class Logement { p u b l i c void v e n d r e ( S t r i n g a c q u e r e u r ) { this . p r o p r i e t a i r e = acquereur ; t h i s . vendu = t r u e ; } } p u b l i c class Appartement extends Logement { p u b l i c void v e n d r e ( S t r i n g a c q u e r e u r ) { this ( acquereur ) ; this . cave = false : } p u b l i c void v e n d r e ( S t r i n g a c q u e r e u r , boolean c a v e ) { this ( acquereur ) ; this . cave = cave : } }
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 39 / 118

Spcialiser une mthode hrite


La rfrence super permet de rednir une mthode f hrite en rutilisant sa dnition dans la classe mre. On dit alors quon spcialise la mthode hrite f.
p u b l i c class A { p u b l i c void f ( ) { ... } } p u b l i c class B extends A { p u b l i c void f ( ) { ... super.f() ... } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

40 / 118

Spcialiser une mthode hrite : exemple


p u b l i c class P o i n t { private int x , y ; ... public S t r i n g t o S t r i n g ( ) { return " ( " + x + " , " + y + " ) " ; } } p u b l i c class P o i n t C o u l e u r extends P o i n t { p r i v a t e byte c o u l e u r ; ... public S t r i n g t o S t r i n g ( ) { r e t u r n super . t o S t r i n g ( ) + "\ nCouleur : " + t h i s . c o u l e u r ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

41 / 118

Limite pour dsigner une mthode rednie

Attention
On ne peut remonter plus haut que la classe mre pour rcuprer une mthode rednie : pas de cast (ClasseAncetre)m() pas de super.super.m()

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

42 / 118

Annotation pour la rednition


Depuis Java 5, on peut annoter par @Override les rednitions de mthodes. Ceci est trs utile pour reprer des fautes de frappe dans le nom de la mthode : le compilateur envoie un message derreur si la mthode ne rednit aucune mthode.
p u b l i c class P o i n t { private int x , y ; ... @Override public S t r i n g t o s t r i n g ( ) { return " ( " + x + " , " + y + " ) " ; } } Point.java:3: method does not override or implement a method from a supertype @Override
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 43 / 118

Outline
Lhritage Principes de lhritage Syntaxe de lhritage en Java Hritage et visibilit Hritage et construction La rednition La covariance Interdire lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

44 / 118

Les fondements de la covariance

Rappels
1. La rednition dune mthode cest le fait de donner une nouvelle implmentation en conservant la signature. 2. La signature dune mthode est compose de son nom et des types de ses arguments.

Dnition On appelle covariance le fait de modier le type de retour dune mthode lors de sa rednition. En Java, elle a t introduite dans la version : Java 1.5.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

45 / 118

Outline
Lhritage Principes de lhritage Syntaxe de lhritage en Java Hritage et visibilit Hritage et construction La rednition La covariance Interdire lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

46 / 118

classes nales

Lors de la conception dune classe, le concepteur peut empcher que dautres classes hritent delle (classe nale).
f i n a l p u b l i c class A { }

Remarque(s) La classe String est une classe nale.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

47 / 118

Mthodes nales

On peut empcher la rednition dune mthode dinstance dune classe dans une de ses sous-classes en la dclarant nal.
p u b l i c class A { f i n a l p u b l i c void f ( ) {} } p u b l i c class B extends A { // on ne p e u t p a s r e d f i n i r f ( ) ! }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

48 / 118

Outline

Lhritage Polymorphisme et hritage Principes du polymorphisme Protocoles et polymorphisme Les protocoles standards Downcasting : la n du polymorphisme. Le polymorphisme impose des limites lhritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

49 / 118

Outline

Lhritage Polymorphisme et hritage Principes du polymorphisme Protocoles et polymorphisme Les protocoles standards Downcasting : la n du polymorphisme. Le polymorphisme impose des limites lhritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

50 / 118

Polymorphisme : dnition

Dnition Le polymorphisme peut tre vu comme la capacit de choisir dynamiquement la mthode qui correspond au type rel de lobjet.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

51 / 118

Principe POO : Polymorphisme


Si la classe B hrite de la classe A Classe B "EST-UN" Classe A toute mthode m de A peut-tre invoque sur une instance de la classe B (+ transitivit sur lhritage de A) Le polymorphisme consiste exploiter cela en fournissant un B dans les expressions "qui attendent" un A.
// un homme e s t un a n i m a l Animal anim1 = new Homme( " Can " , f a l s e ) ; // un c h a t a u s s i Animal anim2 = new Chat ( " E u r o p e n " ) ; System . o u t . p r i n t l n ( anim1 . getNom ( ) ) ; System . o u t . p r i n t l n ( anim2 . getNom ( ) ) ; // un a n i m a l n e s t p a s n c e s s a i r e m e n t un homme Homme h = anim1 ;

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

52 / 118

Choix de la mthode : liaison dynamique


p u b l i c class P o i n t { private int x , y ; ... public S t r i n g t o S t r i n g ( ) { return " ( " + x + " , " + y + " ) " ; } } p u b l i c class P o i n t C o u l e u r extends P o i n t { p r i v a t e byte c o u l e u r ; ... public S t r i n g t o S t r i n g ( ) { r e t u r n super . t o S t r i n g ( ) + "\ nCouleur : " + t h i s . c o u l e u r ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

53 / 118

Choix de la mthode : liaison dynamique (suite)


p u b l i c class T r a c e u r D e L i g n e { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { P o i n t [ ] t a b = new P o i n t [ 3 ] ; t a b [ 0 ] = new PointCouleur ( 2 , 3 , b l e u ) ; t a b [ 1 ] = new PointCouleur ( 2 , 3 , v e r t ) ; t a b [ 2 ] = new PointCouleur ( 2 , 3 , r o u g e ) ; System . o u t . p r i n t l n ( "Ma l i g n e : " ) ; for ( Point p : tab ) System . o u t . p r i n t l n ( " " + p . toString ( ) ) ; } } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

54 / 118

Choix de la mthode : liaison dynamique (suite)


Si p rfrence une PointCouleur, quelle mthode toString() va tre invoque ? 1. La mthode toString() est dnie dans Point 2. Mais elle est spcialise dans PointCouleur Cest la version la plus spcialise (PointCouleur.toString()) qui est invoque car la recherche de la mthode dbute dans la classe eective de lobjet rfrenc par p La recherche est mene lexcution et ce mcanisme est appel la liaison dynamique. Lorsquune mthode est spcialise dans une sous-classe, sa visibilit peut tre augmente (ex. protected public) mais elle ne peut pas tre rduite (ex. public private)
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 55 / 118

crire du code polymorphe : le problme


On veut coder une classe Zoo qui aura plusieurs cages permettant dacceuillir dirents types danimaux. Il faut donc implmenter une classe Cage permettant de contenir tous ces annimaux.
p u b l i c class Zoo { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { Cage uneCage1 = new Cage ( . . . ) ; Cage uneCage2 = new Cage ( . . . ) ; // On a j o u t e un l i o n L i o n u n L i o n = new L i o n ( . . . ) ; uneCage1 . a c c u e i l l i r ( u n L i o n ) ; // On a j o u t e un s i n g e S i n g e u n S i n g e = new S i n g e ( . . . ) ; uneCage2 . a c c u e i l l i r ( u n S i n g e ) ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

56 / 118

crire du code polymorphe : la mauvaise solution

p u b l i c class Cage { p u b l i c void a c c u e i l l i r ( L i o n l ) { ... } p u b l i c void a c c u e i l l i r ( S i n g e s ) { ... } }

Ici, la surcharge est une trs mauvaise solution Si une nouvelle espce animale doit tre prise en compte, il faudra modier le code de la classe Cage

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

57 / 118

crire du code polymorphe : la bonne solution


La bonne solution consiste utiliser le polymorphisme, en implmentant une mthode acceuillir gnrique pour tout les animaux. Son paramtre tant de type Animal on pourra lappeler avec une rfrence de Lion ou de Singe.
p u b l i c class Cage { p u b l i c void a c c u e i l l i r ( Animal a ) { System . o u t . p r i n t l n ( a . getNom ( ) + " e s t en c a g e " ) ; ... } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

58 / 118

Outline

Lhritage Polymorphisme et hritage Principes du polymorphisme Protocoles et polymorphisme Les protocoles standards Downcasting : la n du polymorphisme. Le polymorphisme impose des limites lhritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

59 / 118

Motivation

Nouvelle spcication prendre en compte : tous les animaux ne peuvent pas aller en cage La mthode Cage.accueillir() doit tre mme de dtecter les animaux ne pouvant ltre
p u b l i c class Zoo { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { Cage uneCage1 = new Cage ( . . . ) ; Homme unHomme = new Homme ( . . . ) ; uneCage . a c c u e i l l i r (unHomme ) ; = il refuse !!! } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

60 / 118

Premire solution
p u b l i c class Cage { ... p u b l i c void a c c u e i l l i r ( Animal a ) { i f ( a instanceof Homme ) System . o u t . p r i n t l n ( a . getNom ( ) + " r e f u s e d a l l e r en c a g e " ) ; return ; ... } }

Trs mauvaise solution Des connaissances propres la classe Homme sont dans la classe Cage si une nouvelle espce animale refuse daller en cage, il faudra modier le code de la classe Cage
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 61 / 118

Mise en place dun protocole


p u b l i c class Cage { ... p u b l i c void a c c u e i l l i r ( Animal a ) { i f ( ! a . supporteCage ( ) ) { System . o u t . p r i n t ( a . getNom ( ) ) ; System . o u t . p r i n t l n ( " r e f u s e d a l l e r en c a g e " ) ; return ; } ... } }

Tout animal doit pouvoir rpondre ce protocole Nous allons implmenter le protocole dans la hirarchie de racine Animal, en utilisant lhritage et en spcialisant lorsque cest ncessaire
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 62 / 118

Vue de larbre dhritage

supporteCage() Animal false supporteCage() Vertbr true

Invertbr
supporteCage() false

Mammifre
supporteCage() Homme false

Poisson

Lion

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

63 / 118

Mise en place dun protocole


public class Animal { ... p u b l i c boolean s u p p o r t e C a g e ( ) { r e t u r n f a l s e ; } } p u b l i c c l a s s V e r t b r extends A n i m a l { ... p u b l i c boolean s u p p o r t e C a g e ( ) { r e t u r n t r u e ; } } p u b l i c c l a s s Homme extends Mammifre { ... p u b l i c boolean s u p p o r t e C a g e ( ) { r e t u r n f a l s e ; } } p u b l i c c l a s s Zoo { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { Cage uneCage1 = new Cage ( . . . ) ; uneCage1 . a c c u e i l l i r ( new L i o n ( . . . ) ) ; // G n r e un a p p e l V e r t b r . s u p p o r t e C a g e ( ) ; } }
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 64 / 118

Outline

Lhritage Polymorphisme et hritage Principes du polymorphisme Protocoles et polymorphisme Les protocoles standards Downcasting : la n du polymorphisme. Le polymorphisme impose des limites lhritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

65 / 118

Retour sur les protocoles standards


p u b l i c c l a s s Zoo { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { Cage [ 1 0 ] l e s C a g e s ; L i o n u n L i o n = new L i o n ( . . . ) ; l e s C a g e s [ 0 ] . a c c u e i l l i r ( unLion ) ; S i n g e u n S i n g e = new S i n g e ( . . . ) ; lesCages [ 1 ] . a c c u e i l l i r ( unSinge ) ; f o r ( Cage c : l e s C a g e s ) { System . o u t . println(c.contenu()) ; i f ( u n L i o n . equals(c.contenu()) System . o u t . p r i n t l n ( " J a i t r o u v e l e l i o n " ) ; } } }

La classe Lion ne dispose pas de mthode equals(), pourquoi ny a-t-il pas derreur de compilation ? O est lappel la mthode toString() de Animal ?
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 66 / 118

Le protocole toString()
public c l a s s S ys t e m { static PrintStream out ;

public ... }

public

class void

PrintStream { print ( Object arg ) {

public

p r i n t ( a r g . toString() ) ; } ... }

public

class

Object

{ () {

public } ... }

String

toString

return

g e t C l a s s ( ) . getName ( ) + "@" + I n t e g e r . t o H e x S t r i n g ( h a s h C o d e ( ) ) ;

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

67 / 118

Le protocole toString() suite


La classe Object est la racine de lunique arbre dhritage La classe Animal hrite (implicitement) de la classe Object Il sut de spcialiser la mthode toString() dans vos classes pour quun objet de type PrintStream (tel que System.out) puisse acher vos instances
p u b l i c class Animal ... {

@Override public S t r i n g t o S t r i n g ( ) { r e t u r n t h i s . getNom ( ) ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

68 / 118

Le protocole equals()

La classe Object dispose dune mthode equals()


p u b l i c class Object { ( Object arg ) {

p u b l i c boolean

equals

r e t u r n t h i s == a r g ; } ... }

Elle ne retourne true que si les deux rfrences dsignent le mme objet

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

69 / 118

Le protocole equals() suite


Le protocole equals() est employ dans les paquetages standards pour comparer les objets entre eux Extrait de la documentation de java.util.Arrays :
p u b l i c s t a t i c boolean e q u a l s ( O b j e c t [ ] a , O b j e c t [ ] a2 )

Returns true if the two specied arrays of Objects are equal to one another. The two arrays are considered equal if both arrays contain the same number of elements, and all corresponding pairs of elements in the two arrays are equal. Two objects e1 and e2 are considered equal if
( e1==n u l l ? e2==n u l l : e1 . equals ( e2 ) )

In other words, the two arrays are equal if they contain the same elements in the same order. Also, two array references are considered equal if both are null.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 70 / 118

Spcialisation de equals() dans vos classes


p u b l i c class C o o r d o n n e { private int x , y ; ... p u b l i c boolean e q u a l s ( O b j e c t o b j ) { // t e s t s u r l e s r f r e n c e s i f ( t h i s == o b j ) return true ; i f ( o b j == n u l l ) return false ; // t e s t s u r l e s c l a s s e s i f ( this.getClass ( ) != o b j . getClass ( ) ) return false ; // t e s t s u r l e s d o n n e s C o o r d o n n e o t h e r = (Coordonne) obj ; r e t u r n ( t h i s . x == o t h e r . x && t h i s . y == o t h e r . y ) ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

71 / 118

Outline

Lhritage Polymorphisme et hritage Principes du polymorphisme Protocoles et polymorphisme Les protocoles standards Downcasting : la n du polymorphisme. Le polymorphisme impose des limites lhritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

72 / 118

Upcasting : classe lle classe mre


Dnition On appelle surclassement ou upcasting le fait denregistrer une rfrence dune instance dune classe B hritant dune classe A dans une variable de type A. En java, cette opration est implicite et constitue la base du polymorphisme.

p u b l i c class A { . . . } p u b l i c class B extends A { . . . } A a = new B ( ) // C e s t de l u p c a s t i n g ( s u r c l a s s e m e n t ) .

On dit que a1 est une rfrence surclasse (elle est du type A et contient ladresse dune instance dune sous-classe de A).
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 73 / 118

Downcasting : classe mre classe lle


Dnition On appelle dclassement ou downcasting le fait de convertir une rfrence surclasse pour librer certaines fonctionnalits caches par le surclassement. En java, cette conversion nest pas implicite, elle doit tre force par lopprateur de cast : (<nomClasse>).
p u b l i c class A { . . . } p u b l i c class B extends A { . . . } A a = new B ( ) ; // s u r c l a s s e m e n t , u p c a s t i n g B b = (B) a ; // d o w n c a s t i n g

Pour que la conversion fonctionne, il faut qu lexcution le type rel de la rfrence convertir soit B ou une des sous-classe de B !
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 74 / 118

Downcasting : mise en garde ! Attention


Le downcasting ne permet pas de convertir une instance dune classe donne en une instance dune sous-classe !
class A { A ( ) {}} class B extends A { B ( ) {}} A a = new A ( ) ; B b = (B) a ;

a compile, mais a plantera lexcution :


Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 75 / 118

Downcasting : utilisation de instanceof


On peut utiliser le mot-cl instanceof pour savoir si une rfrence dune classe donne ou dune de ces sous-classes. Si a est une rfrence de type B alors lexpression a instanceof A renvoie true si B est une sous-classe de A et false sinon.
a = new B ( ) ; i f ( a i n s t a n c e o f A) { System . o u t . p r i n t ( " a r f r e n c e un A , " ) ; System . o u t . p r i n t l n ( " ou une s o u s c l a s s e de A . " ) ; }

Remarque(s) Attention, lutilisation dinstanceof est souvent la marque dun dfaut de conception et va lencontre du polymorphisme.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

76 / 118

Exemple : classe rendant un service gnrique.


public class Garage { Veh icu le [ ] tab ; int nbVehicules ; Garage ( i n t t a i l l e ) { t a b = new V e h i c u l e [ t a i l l e ] ; nbVehicules = 0; } void e n t r e r V e h i c u l e ( V e h i c u l e v ) { i f ( n b V e h i c u l e s <t a b . l e n g t h ) t a b [ n b V e h i c u l e s ++] = v ; } Vehicule sortirVehicule () { i f ( n b V e h i c u l e s >0) r e t u r n t a b [ n b V e h i c u l e s ] ; else return null ; } }
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 77 / 118

Exemple : polymorphisme dhritage

p u b l i c class V e h i c u l e { ... } p u b l i c class Moto extends V e h i c u l e { ... } p u b l i c class V o i t u r e extends V e h i c u l e { int temperature ; ... void a u g m e n t e r C h a u f f a g e ( i n t deg ) { t e m p e r a t u r e += deg ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

78 / 118

Exemple : le downcast cest la n du polymorphisme


p u b l i c class Main { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { I n d i v i d u moi = new I n d i v i d u ( . . . ) ; G a r a g e monGarage = new G ar a g e ( 2 ) ; // Le p o l y m o r p h i s m e p e r m e t de g a r e r d e s // v h i c u l e s s a n s s o c c u p e r de l e u r s t y p e s . monGarage . e n t r e r V e h i c u l e ( new Moto ( ) ) ; monGarage . e n t r e r V e h i c u l e ( new V o i t u r e ( ) ) ; ... V e h i c u l e u n V e h i c u l e = monGarage . s o r t i r V e h i c u l e ( ) ; i f ( moi . a v o i r F r o i d ( ) ) { // S i on ne p a r t a g e p a s l e g a r a g e , on s a i t // qu on v i e n t de s o r t i r une v o i t u r e (( Voiture ) unVehicule ) . augmenterChauffage ( 1 0 ) ; } } }
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 79 / 118

Outline

Lhritage Polymorphisme et hritage Principes du polymorphisme Protocoles et polymorphisme Les protocoles standards Downcasting : la n du polymorphisme. Le polymorphisme impose des limites lhritage Classes et mthodes abstraites Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

80 / 118

Ce quon ne peut pas faire et ne pas faire


Pour permettre le polymorphisme : = une sous classe doit pouvoir se faire passer pour une sur classeur ; = une lle doit pouvoir le faire tout ce que fait sa mre ; On ne peut rien supprimer : On ne peut pas supprimer un membre ; Changer le type dun attribut ; On ne peut pas rduire la visibilit dun membre ; La covariance doit maintenir la compatibilit (voir suivants). Par contre on peut toujours ajouter/modier des choses : On peut ajouter des membres ; On peut rednir des mthodes ; On peut augmenter la visibilit dun membre.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 81 / 118

Problme de la covariance
Dans cet exemple de covariance, peut-on choisir Y librement ?

p u b l i c class A { ... public X f ( i n t x ) { ... } } p u b l i c class B extends A { ... @Override public Y f ( i n t x ) { ... } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

82 / 118

Problme de la covariance
Dans cet exemple de covariance, peut-on choisir Y librement ?

p u b l i c class A { ... public X f ( i n t x ) { ... } } p u b l i c class B extends A { ... @Override public Y f ( i n t x ) { ... } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

83 / 118

Limite de la covariance
p u b l i c class Main { s t a t i c void g (A a ) { ... X x = a . f (3); ... } p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { A a = new A ( ) ; g(a ); a = new B ( ) ; // Q u e l l e v e r s i o n f s e r a e x e c u t e d a n s c e t a p p e l ? g(a ); } }

Cest la verion de B qui sera execute : = La rfrence de Y retourne doit tre "compatible" avec X = La classe Y doit tre un descendant de de la classe X
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 84 / 118

Limite de la covariance

Rgle de covariance
Lorsque lon fait de la rednition avec covariance, le nouveau type de retour doit toujours tre un sous-type du type de retour original.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

85 / 118

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Principes des classes abstraites Exemple de classe abstraite Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

86 / 118

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Principes des classes abstraites Exemple de classe abstraite Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

87 / 118

Motivation
p u b l i c class A n i m a t i o n { ... p u b l i c void f a i r e M a n g e r ( Animal a , N o u r r i t u r e n ) { ... a . manger ( n ) ; ... } ... }

Il faut introduire une mthode manger() dans la classe Animal pour que cela compile problme = quel comportement y dcrire puisque la faon de manger dpend de lespce animale ?
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 88 / 118

Spcication dun protocole sans implmentation par dfaut


Spcication du protocole le plus haut possible dans larbre dhritage
public ... abstract class Animal {

p u b l i c abstract void manger ( N o u r r i t u r e n ) ; // p a s de c o d e a s s o c i ... }

Spcialisation du protocole l o cest ncessaire dans larbre dhritage


p u b l i c class L i o n extends Mammifre { ... p u b l i c void manger ( N o u r r i t u r e n ) { . . . // c o d e s p c i f i q u e aux l i o n s } ... }
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 89 / 118

Mthodes abstraites = Classe abstraite

Dnition Un classe contenant au moins une mthode abstraite est appele une classe abstraite et cela doit tre explicitement prcis dans la dclaration avec : abstract class Remarque(s) Une classe abstraite peut contenir des mthodes concrtes. Une classe peut tre dclare abstraite sans contenir de mthode abstraite.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

90 / 118

Classe abstraite : instanciation et spcialisation.


Une classe abstraite constitue un type part entire :
Animal unAnimal ; // OK

Une classe abstraite ne peut pas tre instancie, en eet son comportement nest pas compltement dni :
Animal unAnimal = new Animal ( . . . ) ; // ERREUR

Une sous-classe dune classe abstraite peut


implmenter toutes les mthodes abstraites de sa super-classe. Elle pourra alors tre dclare comme concrte et donc instancie. ne pas implmenter toutes ces mthodes abstraite. Elle reste alors ncessairement abstraite ( abstract class ) et ne pourra tre instancie. ajouter dautre(s) mthode(s) abstraite(s). Elle reste alors ncessairement abstraite ( abstract class ) et ne pourra tre instancie. (INRIA/UPMC) Le polymorphisme en Java. 91 / 118

J. Sopena

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Principes des classes abstraites Exemple de classe abstraite Interfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

92 / 118

Exemple : besoin
Considrons la hirarchie de classes suivantes :

aire()

Figure

Cercle

Rectangle

Cahier de charge : on veut que toutes les classes disposent de la mthode aire() retournant laire de la gure gomtrique dnie par la classe.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

93 / 118

Exemple : dclaration de la classe abstraite.


p u b l i c a b s t r a c t class F i g u r e { p r i v a t e S t r i n g nom ; // Une c l a s s e a b s t r a i t e ne p e u t p a s t r e i n s t a n c i e , // m a i s e l l e p e u t a v o i r un c o n s t r u c t e u r : p u b l i c F i g u r e ( S t r i n g nom ) { t h i s . nom=nom ; } // V o i l l a mthode a b s t r a i t e c o m p l t e r : p u b l i c a b s t r a c t double a i r e ( ) ; // T o u t e s l e s mthodes ne s o n t p a s a b s t r a i t e s : public S t r i n g q u i S u i s J e ( ) { System . o u t . p r i n t l n ( " Je s u i s un " + t h i s . nom ) ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

94 / 118

Exemple : premire implmentation.

p u b l i c class C e r c l e extends F i g u r e { p r i v a t e double r a y o n ; p u b l i c C e r c l e ( double r a y o n ) { super ( " c e r c l e " ) ; this . rayon = rayon ; } p u b l i c double a i r e ( ) { r e t u r n Double . PI t h i s . r a y o n t h i s . r a y o n ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

95 / 118

Exemple : deuxime implmentation.

p u b l i c class R e c t a n g l e extends F i g u r e { p r i v a t e double l a r g e u r ; p r i v a t e double l o n g u e u r ; p u b l i c R e c t a n g l e ( double l a r g e u r , double l o n g u e u r ) { super ( " r e c t a n g l e " ) ; this . largeur = largeur ; this . longueur = longueur ; } p u b l i c double a i r e ( ) { return this . l a r g e u r this . longueur ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

96 / 118

Exemples du standard
Extrait de la documentation de java.lang.Number : The abstract class Number is the superclass of classes BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, and Short. Subclasses of Number must provide methods to convert the represented numeric value to byte, double, float, int, long, and short.
public abstract i n t i n t V a l u e ( ) ; p u b l i c a b s t r a c t long l o n g V a l u e ( ) ; public abstract f l o a t f l o a t V a l u e ( ) ; ...

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

97 / 118

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces Prambule et dnition Dclaration et implmentation Polymorphisme dinterface Classe ou interface ? Composition dinterfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

98 / 118

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces Prambule et dnition Dclaration et implmentation Polymorphisme dinterface Classe ou interface ? Composition dinterfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

99 / 118

Prambule

Problmes rsoudre : assurer quun ensemble de classes ore un service minimum commun. faire du polymorphisme avec des objets dont les classes nappartiennent pas la mme hirarchie dhritage. utilisation dobjets sans connatre leur type rel. Solution : la dnition dun type compltement abstrait nomm interface (notion de contrat).

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

100 / 118

Dnition

Quand toutes les mthodes dune classe sont abstraites et quil ny a aucun attribut, on aboutit la notion dinterface. Dnition Une interface est un prototype de classe. Elle dnit la signature des mthodes qui doivent tre implmentes dans les classes construites partir de ce prototype. Une interface est une classe purement abstraite dont toutes les mthodes sont abstraites et publiques. Les mots-cls abstract et public sont optionnels.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

101 / 118

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces Prambule et dnition Dclaration et implmentation Polymorphisme dinterface Classe ou interface ? Composition dinterfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

102 / 118

Dclaration : syntaxe
La dnition dune interface se prsente comme celle dune classe, en utilisant le mot-cl interface la place de class.
p u b l i c i n t e r f a c e Comparable { p u b l i c a b s t r a c t boolean p l u s G r a n d ( O b j e c t o ) ; } public interface Tracable { void d e s s i n e T o i ( ) ; void d e p l a c e T o i ( i n t x , i n t y ) ; }

Remarque(s) Dans les dclarations des mthodes de la classe Tracable, les mots cls public et abstract sont implicites, mais ce nest pas recommand.
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 103 / 118

Dclaration : rgles
Comme les classes abstraites, les interfaces ne sont pas instanciables : Une interface ne possde pas dattribut instance. Une interface na pas de constructeur. Le but des interfaces est dnir des API : toutes leurs mthodes sont public. Elles ne dnissent pas les mcanismes internes public abstract int f(); tout leurs attributs de classe sont des constante, cest--dire dnir des attributs dclares comme public static nal et ayant une valeur constante daectation. Exemple : public static nal float PI = 3.14f;

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

104 / 118

Implmentation dune interface


Dnition On dit quune classe implmente une interface si elle dnit lensemble des mthodes abstraites de cette interface. On utilise alors, dans lentte de la classe, le mot-cl implements suivi du nom de linterface implmete.
class P e r s o n n e implements Comparable {

p r i v a t e S t r i n g nom ; p r i v a t e S t r i n g prenom ; ... p u b l i c boolean p l u s G r a n d ( O b j e c t o ) { r e t u r n t h i s . nom . compareTo ( ( ( P e r s o n n e ) o ) . nom ) | | t h i s . prenom . compareTo ( ( ( P e r s o n n e ) o ) . prenom ) ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

105 / 118

Implmentation dune interface Attention


La classe doit implmenter toutes les mthodes de linterface, sinon elle doit tre dclare abstract.

abstract class C e r c l e implements T r a c a b l e { private i n t xCentre , yCentre ; private i n t rayon ; ... p u b l i c void d e p l a c e T o i ( i n t x , i n t y ) { x C e n t r e += x ; y C e n t r e += y ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

106 / 118

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces Prambule et dnition Dclaration et implmentation Polymorphisme dinterface Classe ou interface ? Composition dinterfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

107 / 118

Utilisation comme type de donnes

Une interface peut remplacer une classe pour dclarer : un attribut une variable un paramtre une valeur de retour A lexcution, la donne correspond une rfrence dun objet dont la classe implmente linterface. Cest suivant le type rel de cet objet que lon choisira le code des mthodes excuter.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

108 / 118

Exemple dutilisation comme type de donnes.


p u b l i c class Main { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { Comparable v a r 1 , v a r 2 ; ... i f ( var1 . plusGrand ( var2 )) { System . o u t . p r i n t l n ( " Var1 e s t p l u s g r a n d que v a r 2 " ) ; } else { System . o u t . p r i n t l n ( " Var1 e s t p l u s p e t i t que v a r 2 " ) ; } } }

Ici les variables var1 et var2 contiennent des rfrences vers des objets dont les classes : peuvent tre direntes implmentent linterface Comparable
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 109 / 118

Exemple de polymorphisme dans un tableau


p u b l i c class L i s t e E l e m e n t s { Comparable [ ] t a b ; i n t nbElements = 0 ; ... p u b l i c void a d d E l e m e n t ( Comparable e ) { tab [ nbElements ] = e ; n b E l e m e n t s++ ; } p u b l i c boolean c r o i s s a n t ( ) { f o r ( i n t i = 1 ; i < n b E l e m e n t s ; i ++) { i f ( tab [ i 1]. plusGrand ( tab [ i ] ) ) return false ; } return true ; } }

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

110 / 118

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces Prambule et dnition Dclaration et implmentation Polymorphisme dinterface Classe ou interface ? Composition dinterfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

111 / 118

Choix entre classe et interface : principe

Une interface peut servir faire du polymorphisme comme lhritage, alors comment choisir entre classe et interface ? 1. Choix dict par lexistant : Lhritage nest plus possible, la classe hrite dj dune autre classe. Il ne reste plus que celui linterface. 2. Choix la conception : On tudie la relation entre A et B ?
Un objet de classe B "EST UN" A
= Hritage : B extends A.

Un objet de classe B "EST CAPABLE DE FAIRE" A


= Interface : B implements A.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

112 / 118

Choix entre classe et interface : exemple

Une grenouille "EST UN" amphibien :


class G r e n o u i l l e ... } extends Amphibien {

Une grenouille "EST CAPBLE DE FAIRE" amphibie :


class G r e n o u i l l e ... } implements Amphibie {

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

113 / 118

Outline

Lhritage Polymorphisme et hritage Classes et mthodes abstraites Interfaces Prambule et dnition Dclaration et implmentation Polymorphisme dinterface Classe ou interface ? Composition dinterfaces

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

114 / 118

Implmentation de plusieurs interfaces


Une classe peut hriter dune autre classe et implmenter une interface :
class G r e n o u i l l e ... } extends Batracien implements Amphibie {

Une classe peut implmenter plusieurs interfaces :


class G r e n o u i l l e ... } implements SurTerre, SurEau {

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

115 / 118

Extension dune interface

Lorsquune capacit sexprime comme une extension dune autre capacit, on peut tendre une interface en utilisant le mot cl extends :
interface SavoirConduire { ... } i n t e r f a c e S a v o i r P i l o t e r extends S a v o i r C o n d u i r e p u b l i c a b s t r a c t void d e r a p e r ( i n t d e g r e ) ; } {

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

116 / 118

Composition de plusieurs interfaces


Lorsquune capacit sexprime comme un ensemble dautres capacits, on peut faire de la composition dinterfaces en utilisant le mot cl extends :
i n t e r f a c e Amphibie ... } extends S u r T e r r e , SurEau {

Attention
Mme si lon utilise le mme mot cl que pour lhritage, ce nest pas de lhritage multiple qui nexiste pas en Java.

J. Sopena (INRIA/UPMC)

Le polymorphisme en Java.

117 / 118

Polymorphisme dinterfaces
Comme pour les classes, on peut faire du polymorphisme dinterfaces.
p u b l i c c l a s s C h a u f f e u r extends Homme implements S a v o i r C o n d u i r e { ... } p u b l i c c l a s s P i l o t e extends Homme implements S a v o i r P i l o t e r { ... } public class Course { p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { SavoirConduire [10] participants ; C h a u f f e u r j u l i e n = new C h a u f f e u r ( ) ; P i l o t e s e b a s t i e n L o e b = new P i l o t e ( ) ; participants [0] = julien ; participants [1] = sebastienLoeb ; } }
J. Sopena (INRIA/UPMC) Le polymorphisme en Java. 118 / 118