Escolar Documentos
Profissional Documentos
Cultura Documentos
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
1 / 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
1. Encapsulation
Rapprochement des donnes (attributs) et traitements (mthodes) Protection de linformation (private et public)
B
...
3. Utilisation
Classe A "UTILISE" Classe B
A
...
B
...
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
5 / 118
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
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
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
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
Important
En Java, toutes les classes hritent de la classe Object.
La dclaration
p u b l i c class A { . . . }
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
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
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
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
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
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
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
30 / 118
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
32 / 118
Le polymorphisme en Java.
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) {
f (int x)
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
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
40 / 118
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
41 / 118
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
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
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 { }
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
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
52 / 118
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
53 / 118
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
54 / 118
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
56 / 118
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
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
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
Invertbr
supporteCage() false
Mammifre
supporteCage() Homme false
Poisson
Lion
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
63 / 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
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
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
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
68 / 118
Le protocole equals()
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
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
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
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
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
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
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
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
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
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
Une classe abstraite ne peut pas tre instancie, en eet son comportement nest pas compltement dni :
Animal unAnimal = new Animal ( . . . ) ; // ERREUR
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
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
94 / 118
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
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
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
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
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
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
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
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.
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
112 / 118
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
J. Sopena (INRIA/UPMC)
Le polymorphisme en Java.
115 / 118
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
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