if224 - programmation objet - filière see

33
eutilisation d’une classe lien a-un et r´ eutilisation Le m´ ecanisme d’h´ eritage L’h´ eritage en Java eritage de classe eritage de classe et polymorphisme. IF224 - Programmation objet - Fili` ere SEE 5 e eance 1 / 33

Upload: others

Post on 18-Jun-2022

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: IF224 - Programmation objet - Filière SEE

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

Page 2: IF224 - Programmation objet - Filière SEE

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

Page 3: IF224 - Programmation objet - Filière SEE

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

Page 4: IF224 - Programmation objet - Filière SEE

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

Page 5: IF224 - Programmation objet - Filière SEE

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

Page 6: IF224 - Programmation objet - Filière SEE

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

Page 7: IF224 - Programmation objet - Filière SEE

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

Page 8: IF224 - Programmation objet - Filière SEE

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

Page 9: IF224 - Programmation objet - Filière SEE

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

Page 10: IF224 - Programmation objet - Filière SEE

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

Page 11: IF224 - Programmation objet - Filière SEE

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

Page 12: IF224 - Programmation objet - Filière SEE

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

Page 13: IF224 - Programmation objet - Filière SEE

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

Page 14: IF224 - Programmation objet - Filière SEE

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

Page 15: IF224 - Programmation objet - Filière SEE

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

Page 16: IF224 - Programmation objet - Filière SEE

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

Page 17: IF224 - Programmation objet - Filière SEE

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

Page 18: IF224 - Programmation objet - Filière SEE

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

Page 19: IF224 - Programmation objet - Filière SEE

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

Page 20: IF224 - Programmation objet - Filière SEE

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

Page 21: IF224 - Programmation objet - Filière SEE

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

Page 22: IF224 - Programmation objet - Filière SEE

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

Page 23: IF224 - Programmation objet - Filière SEE

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

Page 24: IF224 - Programmation objet - Filière SEE

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

Page 25: IF224 - Programmation objet - Filière SEE

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

Page 26: IF224 - Programmation objet - Filière SEE

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

Page 27: IF224 - Programmation objet - Filière SEE

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

Page 28: IF224 - Programmation objet - Filière SEE

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

Page 29: IF224 - Programmation objet - Filière SEE

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

Page 30: IF224 - Programmation objet - Filière SEE

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

Page 31: IF224 - Programmation objet - Filière SEE

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

Page 32: IF224 - Programmation objet - Filière SEE

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

Page 33: IF224 - Programmation objet - Filière SEE

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