lu2in002 héritage - laboratoire d'informatique de paris...
TRANSCRIPT
LU2IN002HÉRITAGE
Vincent Guigue & Christophe Marsala
Principes Orientés Objets
Principe 1: EncapsulationRapprochement données (attributs) et traitements (méthodes)Protection de l’information (private/public)
Principe 2: Agrégation/AssociationClasse A A UN Classe BClasse A UTILISE Classe B
Principe 3: HéritageClass B EST UN Classe A
2/16
Héritage
Idée de l’héritageSpécialiser une classe, ajouter des fonctionnalités dans une classeHériter tout le comportement d’une classe existante
1 classe de base = plusieurs spécialisations possiblesAnimaux → vache, chien, mouton...Hiérarchisation possible: Animaux → AnimauxAiles → Papillon
Ne pas modifier le code existantPoint → PointNomme: un point avec un nomNe pas modifier la classe de base
Mais ne pas faire de copier collerHériter le comportement d’une classe
3/16
Exemples & contre exemples
Pour les cas suivants: dire si les relations sont des relations de typeAgrégation/Association ou Héritage:
Salle de Bains et BaignoirePiano et JoueurPianoPersonne, Enseignant et EtudiantAnimal, Chien et LabradorCercle et EllipseEntier et Réel
4/16
Exemples & contre exemples
Pour les cas suivants: dire si les relations sont des relations de typeAgrégation/Association ou Héritage:
Salle de Bains et BaignoirePiano et JoueurPianoPersonne, Enseignant et EtudiantAnimal, Chien et LabradorCercle et EllipseEntier et Réel
4/16
Exemples & contre exemples
Pour les cas suivants: dire si les relations sont des relations de typeAgrégation/Association ou Héritage:
Salle de Bains et BaignoirePiano et JoueurPianoPersonne, Enseignant et EtudiantAnimal, Chien et LabradorCercle et EllipseEntier et Réel
4/16
Exemples & contre exemples
Pour les cas suivants: dire si les relations sont des relations de typeAgrégation/Association ou Héritage:
Salle de Bains et BaignoirePiano et JoueurPianoPersonne, Enseignant et EtudiantAnimal, Chien et LabradorCercle et EllipseEntier et Réel
4/16
Exemples & contre exemples
Pour les cas suivants: dire si les relations sont des relations de typeAgrégation/Association ou Héritage:
Salle de Bains et BaignoirePiano et JoueurPianoPersonne, Enseignant et EtudiantAnimal, Chien et LabradorCercle et EllipseEntier et Réel
⇒ Qu’est ce qu’une SalleDeClasse?Réponse détaillée un peu plus tard
4/16
Exemple: Point et PointNomme
ProblèmeOn veut implémenter deux classes:
1 Point en 2 dimensions2 Point en 2 dimensions qui possède un nom
1 pub l i c c l a s s Po in t { // (1 ) Type / nom de c l a s s e2 p r i v a t e double x ; p r i v a t e double y ; // (2 ) A t t r i b u t s34 pub l i c Po in t ( double x , double y ) { t h i s . x = x ; t h i s . y = y ; } // (3 ) Con s t r u c t e u r s5 pub l i c double getX ( ) { re tu rn x ; }6 pub l i c double getY ( ) { re tu rn y ; }78 pub l i c double c a l c u l eD i s t a n c e ( Po in t p2 ) { // (4 ) methodes ( t r a i t em e n t s )9 double dx = Math . abs ( p2 . getX ( ) − getX ( ) ) ; double dy = Math . abs ( p2 . getY ( ) − getY ( ) ) ;
10 re tu rn Math . s q r t ( dx∗dx+dy∗dy ) ;11 }12 pub l i c vo id move ( double tx , double t y ) { d ep l a c e ( x+tx , y+ty ) ; }13 p r i v a t e vo id dep l a c e ( double x , double y ) { t h i s . x=x ; t h i s . y=y ; }// (5 ) methodes p r i v e e s1415 pub l i c S t r i n g t o S t r i n g ( ) { re tu rn " ( "+x+" , "+y+" ) " ; } // (6 ) methodes s t anda r d s
5/16
Héritage : syntaxe
1 pub l i c c l a s s PointNomme extends Po in t {2 p r i v a t e S t r i n g name ;34 pub l i c PointNomme ( double x , double y , S t r i n g name) {5 super ( x , y ) ;6 t h i s . name = name ;7 }89 pub l i c S t r i n g t o S t r i n g ( ) {
10 re tu rn "PointNomme␣ [ name=" + name + "␣" +11 super . t o S t r i n g ( ) + " ] " ;12 }13 }
Mot clé extends dans la signature de la classeMot clé super
Erreur couranteAttention à ne pas dupliquer les attributs: la classe fille étend la super-classe, ellecontient la super-classe
6/16
Représentation mémoire
1 PointNomme p = new PointNomme (1 , 2 , " t o to " ) ;
1 Représentation complète: tous les objets sont séparés, on représente explicitementla séparation entre attributs de la classe et de la super-classe
PointNomme pString nomPointNomme
double x = 1double y = 2
Point"toto"String
2 Représentation usuelle simplifiée:PointNomme p
String nom = "toto"double x = 1double y = 2
PointNomme
Attention, la représentation de la String est limite...
7/16
Construction d’une instance de la classe fille
Idée:1 construire une instance de la classe mère2 initialiser les attributs relatifs à la classe fille
1 pub l i c c l a s s PointNomme extends Po in t {2 p r i v a t e S t r i n g name ;3 pub l i c PointNomme ( double x , double y , S t r i n g name) {4 super ( x , y ) ; // p r em i e r e i n s t r u c t i o n , o b l i g a t o i r em e n t5 t h i s . name = name ; // i n i t . a t t r i b u t s de l a c l a s s e f i l l e6 }
Règle générale: choisir un constructeur dans la super-classe et l’appeler avecsuper(...)
Exception: si la super-classe a un constructeur sans argument, l’appel à super()est implicite
8/16
Cas particulier : super()
S’il existe un constructeur accessible & sans argument dans la super-classe:1 pub l i c c l a s s Po in t {2 p r i v a t e double x , y ;3 pub l i c Po in t ( ){4 x=0; y=0;5 }6 . . .
Alors, les deux écritures suivantes sont équivalentes:
1 pub l i c c l a s s PointNomme2 extends Po in t {3 p r i v a t e S t r i n g name ;45 pub l i c PointNomme ( S t r i n g name) {6 super ( ) ;7 t h i s . name = name ;8 }9 . . .
1 pub l i c c l a s s PointNomme2 extends Po in t {3 p r i v a t e S t r i n g name ;45 pub l i c PointNomme ( S t r i n g name) {6 t h i s . name = name ;7 }8 . . .
9/16
Représentation des liens UML
Extension des capacités/propriétés d’un objetPointNomme p = newPointNomme(1,2,"totot");
p est un PointNommep est un Point (accès à getX(), getY()...)
10/16
Héritage: propriétés
Si B hérite de A, implicitement, B hérite de:des méthodes publiques de Ades méthodes protégées de Ad’un attribut super du type de la super-classe (A)
super référence la partie de B qui correspond à A
En revanche, B n’hérite pas:des attributs privés de Ades méthodes privées de Ades contructeurs publiques, privés ou protégés de A
invocation spécifique via super()
11/16
Vision client
PointNomme
PointNomme(x, y, nom)getX() : doublegetY() : double
move(tx :double, ty:double) : voidtoString() : StringgetNom() : String
1 PointNomme p =2 new PointNomme (1 ,2 , "p1" ) ;34 System . out . p r i n t l n ( p . getX ( ) ) ;5 // methode d e f i n i e dans Po in t6 // h e r i t e e dans PointNomme7 // u t i l i s e e de man ie re t r a n s p a r e n t e
Méthodes publiques de Point (mais pas les constructeurs)Pas de vision sur les données private
12/16
Nouveau niveau d’accès: protected
protectedNiveau intermédiaireLes attributs et méthodes protected ne sont pas visibles de l’extérieur mais sontvisibles dans les classes filles
public: visible partout, dans la classe et chez le client (main, autres classes...)protected: visible dans la classe, dans les classes filles mais nulle part ailleurs.private: visible dans la classe seulement
13/16
Exemple d’accès protected
1 pub l i c c l a s s Po in t {2 p r i v a t e double x , y ;3 // l e s c l a s s e s d e r i v e e s y ont acc e s4 protected i n t i d ;5 . . .6 }7 pub l i c c l a s s PointNomme {8 . . .9 vo id methode ( double d ){
10 i n t t o t o = i d ; // ou supe r . i d ;11 . . .12 }13 }
Variable/Méthode protectedAccès depuis la classeAccès depuis les classes fillesPas d’accès depuis l’extérieur
Une classe ⇒ 3 visions possibles: développeur, héritier, client14/16
Cas particulier : arguments par défaut
Le constructeur de lasuper-classe a desargumentsLes constructeurs desclasses filles non...
On donne desarguments par défaut
1 pub l i c c l a s s Animal {2 p r i v a t e S t r i n g nom ;3 pub l i c Animal ( S t r i n g nom) {4 t h i s . nom = nom ;5 }6 pub l i c S t r i n g getNom (){7 re tu rn nom ;8 }9 }
1011 pub l i c c l a s s Poule extends Animal {12 p r i v a t e s t a t i c i n t cpt = 0 ;13 pub l i c i n t i d ;1415 pub l i c Poule ( ) {16 super ( " pou l e " ) ;17 i d = cpt++;18 }19 pub l i c S t r i n g t o S t r i n g ( ){20 re tu rn S t r i n g . fo rmat ( "%s%02d" ,21 getNom ( ) , i d ) ;22 }23 }
15/16
Conclusion
Un nouveau paradigme de réflexion, au coeur de la POODes éléments de syntaxe à maitriser... To be continuated (subsomption, surcharge & redéfinition)
16/16