if224 - programmation objet - filière see
TRANSCRIPT
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
IF224 - Programmation objet - Filiere SEE
5eseance
1 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Reutilisation d’une classe
Reutilisation d’une classe pour eviter la duplication de code
2 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
L’exemple
Dans le repertoire s5-src, nous avons le source de deux classesPorteCharniere et PorteCoulissante.
Elles possedent une meme interface d’utilisation (memesmethodes : estFerme() fermer() ouvrir()) mais avec desrealisations differentes.
A partir de ces classes, nous voulons developper les classesPorteVerrouCharniere et PorteVerrouCoulissante.
Ces deux nouvelles classes ajoutent un service de verrou.
3 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Service de verrou
Au code existant, il faut ajouter le code suivant :
p r i v a t e boolean e s t V e r r o u i l l e = f a l s e
pub l i c vo id v e r r o u i l l e r ( ) {e s t V e r r o u i l l e = t rue ;
}pub l i c vo id d e v e r r o u i l l e r ( ) {
e s t V e r r o u i l l e = f a l s e ;}pub l i c boolean e s t V e r r o u i l l e ( ) {
re tu rn e s t V e r r o u i l l e ;}
Et dans le code de la methode ouvrir(), il faut tenir compte duverrou par un test du genre :si (estVerrouille est faux) alors on peut ouvrir
4 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Reutiliser une classe
Il y a trois manieres de reutiliser une classe :
utiliser copier/coller/modifier, duplication de code ;
utiliser une instance, emboıtement d’objets (lien � a-un � enUML association) ;
utiliser le mecanisme d’heritage, mecanisme d’inclusion auniveau des classes (lien � est-un � en UMLgeneralisation/specialisation).
5 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
lien � a-un � et reutilisation
lien � a-un � : reutilisation par emboıtement d’objets
6 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
lien � a-un � et reutilisationPorteVerrouCoulissante
Developpons la classe PorteVerrouCoulissante en utilisant un lien� a-un � avec la classe PorteCoulissante.
Rappel : Le lien � a-un � est un lien entre objets.
Une instance de PorteVerrouCoulissante utilise les methodes d’uneinstance de PorteCoulissante.
La reference de l’instance de PorteCoulissante est stockee dans lazone memoire de l’instance de PorteVerrouCoulissante.Consequence, il faut definir une variable d’instance dans la classe.
7 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
lien � a-un � et reutilisationPorteVerrouCoulissante
Ecrivons la classe PorteVerrouCoulissante.
Mais avant dessinons le diagramme de classe.
8 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Le mecanisme d’heritage
Heritage : reutilisation par inclusion au niveau des classes
9 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Le mecanisme d’heritage
Mecanisme d’inclusion
Le mecanisme d’heritage construit une nouvelle classe D a partird’une classe existante B. La definition de la classe D inclut lesinformations de type et de structure de la classe B.
Relation de type/sous-type
Le mecanisme d’heritage cree une relation de type/sous-type entrela classe B (� classe de base �, � classe mere �) et la nouvelleclasse D (� classe derivee �, � sous-classe �, � classe fille �) :D � est-un � B.
10 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Hierarchie de classes
Avec l’heritage, nous construisons une hierarchie de classes :
Heritage simple un seul type de base direct. La hierachiecorrespond a un arbre avec une seule racine.
Heritage multiple plusieurs types de base directs. La hierachiecorrespond a une foret avec plusieurs racines.
11 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Lien � est-un � et � a-un �
Le lien � est-un � est un lien entre deux types (deux classes) etablia la compilation.
Le lien � a-un � est un lien entre deux objets etabli a l’execution.Ce lien entre objets peut etre modifie pendant l’execution (prendreun exemple dans le paquetage tec).
Le lien � a-un � implique forcement au minimum deux objets. Lemecanisme d’inclusion de l’heritage implique un seul objet.
Dans cette partie sur la reutilisation, ce n’est pas la relation detype/sous-type qui nous interesse mais c’est le mecanismed’inclusion.
12 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
L’heritage en Java
Dans la construction d’une classe, le langage Java separe uneclasse avec realisation (mot-cle class) et une classe sans realisation(mot-cle interface).
Le lien � est-un � correspond aux mecanismes :
l’heritage de classe − > heritage simple ;
l’heritage d’interfaces : entre une classe et des interfaces etentre des interfaces − > heritage multiple.
13 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Heritage de classe
Heritage de classe.Heritage simple.
14 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Heritage de classe
Le mot-cle extends definit la relation d’heritage simple entre deuxconstructions class.
La classe java.lang.Object est la racine de l’arbre d’heritage.
Elle definit quelques methodes d’instance applicables a tous lesobjets comme toString() ou equals(Object).
Une meme classe peut avoir un heritage simple sur uneconstruction class et un heritage multiple sur des constructionsinterface.
15 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Heritage de classe
c l a s s NomClasseextends UneClasseimplements U n e I n t e r f a c e , U n e A u t r e I n t e r f a c e {
// A t t r i b u t s// C o n s t r u c t e u r s// Methodes
}
Sans presence du mot-cle extends, le compilateur ajouteextends Object (heritage par defaut).
Le mot cle final devant une classe bloque l’heritage (la classen’admet pas de sous-classe).
16 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Heritage de classe et reutilisation
c l a s s Cesame extends P o r t e C h a r n i e r e {}
Cesame unCesame = new Cesame ( ) ;unCesame . estFerme ( ) ;unCesame . o u v r i r ( ) ;unCesame . f e r m e r ( ) ;unCesame . t o S t r i n g ( ) ;
La classe Cesame reutilise le code de la classe PorteCharniere et dela classe java.lang.Object.
La zone memoire de l’instance de Cesame contient toutes lesvariables d’instance heritees.
17 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
PorteVerrouCharniere
La definition de la classe derivee peut ajouter des attributs, desmethodes et des constructeurs.
Ajouter un service de verrou au service de la classe PorteCharniere.
pub l i c c l a s s P o r t e V e r r o u C h a r n i e r e extends P o r t e C h a r n i e r e {p r i v a t e boolean e s t V e r r o u i l l e ;
pub l i c P o r t e V e r r o u C h a r n i e r e ( ) { e s t V e r r o u i l l e = f a l s e ; }
pub l i c vo id v e r r o u i l l e r ( ) { e s t V e r r o u i l l e = t rue ; }
pub l i c vo id d e v e r r o u i l l e r ( ) { e s t V e r r o u i l l e = f a l s e ; }
pub l i c boolean e s t V e r r o u i l l e ( ) { re tu rn e s t V e r r o u i l l e ; }}
18 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
PorteVerrouCharniere
P o r t e V e r r o u C h a r n i e r e vch = new P o r t e V e r r o u C h a r n i e r e ( ) ;vch . estFerme ( ) ;vch . f e r m e r ( ) ;vch . v e r r o u i l l e r ( ) ;vch . o u v r i r ( ) ;
Le code est simple a ecrire, mais il y a quelques explications avoir :
Le code de la classe derivee a acces a quels membres herites ?
A l’instanciation de PorteVerrouCharniere
(new PorteVerrouCharniere()), une zone memoire est creeeavec appel au constructeur de la classe PorteVerrouCharniere.Comment sont initialises les attributs herites ?
Comment modifier le code de la methode ouvrir() ?19 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Acces aux membres herites
Un classe derivee herite de toutes les variables et methodes.definies dans la hierarchie des classes de base.
Les membres privees des classes de base ne sont pas accessibles aucode de la classe derivee ; seule les portees publique et paquetagelui sont accessibles.
Une classe derivee ne faisant pas forcement partie du memepaquetage que sa classe de base, une portee protected estdisponible.
Cette portee indique un acces pour les classes derivees sansrestriction du paquetage. Elle permet aussi un acces pour lesclasses du paquetage.
20 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
PorteVerrouCoulissante
package un ;pub l i c c l a s s P o r t e C o u l i s s a n t e {
p r i v a t e f i n a l i n t MAX;p r i v a t e i n t pas ;protected i n t nombreDePasRestant ;// . . .
}
package deux ;c l a s s P o r t e V e r r o u C o u l i s s a n t e extends P o r t e C o u l i s s a n t e {
p r i v a t e boolean e s t V e r r o u i l l e ;// . . .pub l i c vo id v e r r o u i l l e r ( ) {i f ( nombreDePasRestant < 3) { e s t V e r r o u i l l e = t rue ; }
}// . . .
}
21 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
PorteVerrouCoulissante
Avec l’heritage, les attributs sont toujours avec une portee� private � accessibles par des methodes de portee � protected �.
Pourquoi suivre le principe de masquage des attributs meme avecl’herirage ?
22 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Instanciation d’une classe derivee
L’instanciation d’une classe derivee cree une seule zone memoire.Toutes les variables d’instance definies dans la branche de l’arbred’heritage se trouvent dans cette zone memoire.
Il n’est pas possible de modifier la declaration (type, portee) d’unevariable heritee.
Dans la classe derivee, il faut ecrire un constructeur pour initialiserles attributs de la classe mais aussi les attributs de classes de base.
Les attributs de la classe de base doivent etre initialises avant ceuxde la classe derivee.
23 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Instanciation d’une classe deriveeChainage des constructeurs
Le code du constructeur de la classe derivee ne peut s’executerqu’apres celui du constructeur de la classe de base.
Cet ordre d’initialisation impose un chaınage d’appel desconstructeurs des classes de base.
Le programmeur ecrit l’appel explicite a un des constructeurs de laclasse de base directe en utilisant l’instructionsuper(par1, par2,...). Cette instruction doit se trouver enpremiere ligne du code du constructeur.
Le choix du constructeur se fait pendant la compilation a partir dutype des parametres (mecanisme de surcharge).
24 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
PorteVerrouCoulissante
pub l i c c l a s s P o r t e C o u l i s s a n t e {// . . .pub l i c P o r t e C o u l i s s a n t e ( i n t pasMax ) {
MAX = pasMax ;pas = pasMax ;
}}
pub l i c c l a s s P o r t e V e r r o u C o u l i s s a n t e extends P o r t e C o u l i s s a n t e {p r i v a t e boolean e s t V e r r o u i l l e ;// . . .pub l i c P o r t e V e r r o u C o u l i s s a n t e ( i n t pasMax ) {
super ( pasMax ) ;e s t V e r r o u i l l e = f a l s e ;
}}
25 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Instanciation d’une classe deriveeChainage des constructeurs : appel implicite
Lorsqu’il n’y a pas d’instruction super() sur la premiere ligne ducode du constructeur, le compilateur ajoute l’instruction super();
en premiere ligne. Appel implicite au constructeur sans parametrede la classe de base.
Que se passe-t-il si la classe de base ne definit pas de constructeursans parametre ?
c l a s s S a n s C o n s t r u c t e u r extends P o r t e C o u l i s s a n t e {
}
Revoir la classe PorteVerrouCharniere.
26 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
Redefinition d’une methode d’instance
Dans une classe derivee, il est parfois necessaire d’adapter le coded’une methode d’instance heritee a la nouvelle realisation.
La redefinition (� method overriding �) permet de reecrire le coded’une methode d’instance heritee.
Ce mecanisme n’est applicable que sur une methode accessible eten respectant le prototype declare dans la classe de base.
Pour eviter un appel recursif, le mot-cle super permet de dedesigner la methode de la classe de base directe.
Le mot cle final devant le prototype de la methode empeche laredefinition de cette methode dans les classes derivees.
27 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Acces aux membres heritesInstanciation d’une classe deriveeLe mecanisme de redefinition des methodes d’instance
PorteVerrouCoulissante
pub l i c c l a s s P o r t e C o u l i s s a n t e {// . . .pub l i c vo id o u v r i r ( ) {
f o r ( ; pas > 0 ; pas−−) ;}
}pub l i c c l a s s P o r t e V e r r o u C o u l i s s a n t e extends P o r t e C o u l i s s a n t e {
// . . .pub l i c boolean e s t V e r r o u i l l e ( ) { re tu rn e s t V e r r o u i l l e ;}// . . .@ O v e r r i d epub l i c vo id o u v r i r ( ) {
i f ( ! e s t V e r r o u i l l e ( ) )super . o u v r i r ( ) ;
}}
28 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Heritage et polymorphisme
Heritage et polymorphisme.retour sur la relation de type/sous-type.
29 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Retour sur le polymorphismela methode ouvrir()
Avec la relation de type/sous-type definit par l’heritage, il estpossible d’ecrire :
class Maison {
static public void ouvreToi(PorteCoulissante cl) {
cl.fermer ();
cl.ouvrir ();
}
}
// . . .Maison.ouvreToi(new PorteVerrouCoulissante (5));
La variable cl peut referencer les instances des sous-types dePorteCoulissante (substitution d’objets).
Pour connaıtre la methode declenche par l’appel a cl.ouvrir(), ilfaut savoir si la liaison entre la methode et son adresse est statiqueou dynamique.
30 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Retour sur le polymorphismela methode d’ouvrir()
Liaison dynamique
Pour les methodes d’instance, la selection de l’adresse se fait avecla liaison dynamique ou retardee (a l’execution) par rapport al’objet reference par la variable.
Liaison statique
Pour les methodes de classe, la selection de l’adresse se fait avecune liaison statique (a la compilation) par rapport au type de lavariable.
Remarque : En Java, il est possible de faire appel d’une methodede classe sur une instance de cette classe.
31 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Retour sur le polymorphismela methode coulisser()
P o r t e V e r r o u C o u l i s s a n t e v c l = new P o r t e V e r r o u C o u l i s s a n t e ( 1 0 ) ;v c l . f e r m e r ( ) ;v c l . v e r r o u i l l e r ( ) ;v c l . c o u l i s s e r ( ) ;v c l . e s t f e r m e ( ) ; // ??
La methode coulisser() est heritee de la classe PorteCoulissante.Son code dans la classe PorteCoulissante appelle la methodeouvrir().
Expliquer quelle methode ouvrir() est appelee ?
Que faut-il retenir de cet exemple ?
32 / 33
Reutilisation d’une classelien � a-un � et reutilisation
Le mecanisme d’heritageL’heritage en JavaHeritage de classe
Heritage de classe et polymorphisme.
Retour sur le polymorphismesubstitution d’objets.
Encore un cas de substitution d’objets.
class Maison {
static public void rouvreToi(PorteCoulissante cl) {
cl.fermer ();
while (cl.estFerme ()) {
cl.ouvrir ();
}
}
}
// . . .PorteVerrouCoulissante vcl = new PorteVerrouCoulissante (5);
vcl.verrouiller ()
Maison.rouvreToi(vcl);
Que se passe-t-il a l’execution ?33 / 33