• Aucun résultat trouvé

LU2IN002 HÉRITAGE : PRINCIPE DE SUBSOMPTION

N/A
N/A
Protected

Academic year: 2022

Partager "LU2IN002 HÉRITAGE : PRINCIPE DE SUBSOMPTION"

Copied!
15
0
0

Texte intégral

(1)

LU2IN002 HÉRITAGE :

PRINCIPE DE SUBSOMPTION

Vincent Guigue & Christophe Marsala

(2)

Polymorphisme

Si la classe B hérite de la classe A:

le type B « EST-UN » le type A

les méthodes de A peut-être invoquée sur une instance de la classe B (+

transitivité A hérite de SA, SA hérite de SSA, etc.)

Subsomption: Dans toute expression « qui attend » un A (type A), je peux

« placer » un B à la place

Polymorphisme = exploiter la subsomption

1 P o i n t p = new PointNomme ( 1 , 2 ," t o t o ") ;

Un PointNomme EST UN Point ⇒

Je peux le traiter comme tel

2/13

(3)

Polymorphisme: représentation mémoire

Syntaxe:

1 P o i n t p = new PointNomme ( 1 , 2 ," t o t o ") ;

2 // PointNomme EST UN P o i n t

Limite

1 p . getNom ( ) ; // −> ERREUR de c o m p i l a t i o n

Role du compilateur:

il vérifie le type des variables et les possibilités offertes par celles-ci.

Représentation mémoire:

String nom = "toto" double x = 1 double y = 2

PointNomme Point p

⇒ bien distinguer le type des instances et des variables

3/13

(4)

Polymorphisme: représentation mémoire

Syntaxe:

1 P o i n t p = new PointNomme ( 1 , 2 ," t o t o ") ;

2 // PointNomme EST UN P o i n t

Limite

1 p . getNom ( ) ; // −> ERREUR de c o m p i l a t i o n

Role du compilateur:

il vérifie le type des variables et les possibilités offertes par celles-ci.

Représentation mémoire:

String nom = "toto"

double x = 1 double y = 2

PointNomme Point p

⇒ bien distinguer le type des instances et des variables

3/13

(5)

Polymorphisme: visions compilateurs vs JVM

1 P o i n t p = new PointNomme ( 1 , 2 ," t o t o ") ;

String nom = "toto"

double x = 1 double y = 2

PointNomme Point p

Compilateur

La variable p est de type Point: seule les méthodes de Point sont accessibles:

+ p.getX(); p.getY(); //...

− p.getNom();

⇒ Erreur de compilation (méthode inconnue dans la classe Point)

JVM

L’instance référencée par p est de type PointNomme

+ En cas d’appel à toString(), c’est bien la méthode de PointNomme qui est invoquée.

4/13

(6)

Polymorphisme: passage aux tableaux

Application classique sur les tableaux de concepts abstraits:

1 P o i n t [ ] t a b = new P o i n t [ 1 0 ] ; // OK,

2 // i l s ’ a g i t de 10 v a r i a b l e s de t y p e P o i n t

Point[] tab

3 f o r(i n t i =0; i <t a b . l e n g t h ; i ++){

4 i f( i %2==0)

5 t a b [ i ] = new P o i n t ( Math . random ( )∗1 0 , Math . random ( )∗1 0 ) ;

6 e l s e

7 t a b [ i ] = new PointNomme ( Math . random ( )∗1 0 ,

8 Math . random ( )∗1 0 , " t o t o "+ i ) ;

9 }

Point[] tab

Point Point

PointNomme PointNomme

5/13

(7)

Polymorphisme: passage aux tableaux

Application classique sur les tableaux de concepts abstraits:

1 P o i n t [ ] t a b = new P o i n t [ 1 0 ] ; // OK,

2 // i l s ’ a g i t de 10 v a r i a b l e s de t y p e P o i n t

3 f o r(i n t i =0; i <t a b . l e n g t h ; i ++){

4 i f( i %2==0)

5 t a b [ i ] = new P o i n t ( Math . random ( )∗1 0 , Math . random ( )∗1 0 ) ;

6 e l s e

7 t a b [ i ] = new PointNomme ( Math . random ( )∗1 0 ,

8 Math . random ( )∗1 0 , " t o t o "+ i ) ;

9 }

Point[] tab

Point Point

PointNomme PointNomme

5/13

(8)

Polymorphisme: application sur un tableau

Point[] tab

Point Point

PointNomme PointNomme

1 // p a r e x e m p l e , p r o c e d u r e de F i g u r e ( methode de c l a s s e )

2 p u b l i c s t a t i c v o i d t r a n s l a t e r T o u t ( P o i n t [ ] p t s , d o u b l e t x , d o u b l e t y ) {

3 f o r(i n t i =0; i <p t s . l e n g t h ; i ++)

4 p t s [ i ] . move ( t x , t y ) ;

5 }

6

7 // v a r i a n t e

8 p u b l i c s t a t i c v o i d t r a n s l a t e r T o u t ( P o i n t [ ] p t s , d o u b l e t x , d o u b l e t y ) {

9 f o r( P o i n t p : p t s )

10 p . move ( t x , t y ) ;

11 }

6/13

(9)

Exemple plus complexe

⇒ Bien réfléchir aux opérations à effectuer sur les tableaux recherche/affichage d’un nom

translation

7/13

(10)

Limites du polymorphisme

On ne peut qu’invoquer les méthodes du super-type

ex.: si le type est Figure, on ne peut invoquer que les méthodes de Figure, même si l’instance est un Point, un Carré, etc.

1 F i g u r e f i g 1 = new C a r r e ( 2 , 1 , 4 , 5 ) ;

2 f i g 1 . t r a n s l a t e r ( 2 , 2 ) ; // OK t y p e F i g u r e

3 d o u b l e x = f i g 1 . c a l c u l e r S u r f a c e ( ) ; // KO t y p e F i g u r e !

4

5 F i g u r e f i g 2 = new P o i n t ( 2 , 1 ) ;

6 f i g 2 . t r a n s l a t e r ( 2 , 2 ) ; // OK t y p e F i g u r e

7 f i g 2 . ge t X ( ) ; // KO t y p e F i g u r e !

Role du compilateur:

il vérifie le type des variables est les possibilités offertes par celles-ci.

8/13

(11)

Classe Object Classe standard

Toutes les classes dérivent de la classe Object de JAVA

Héritage implicite : pas de déclaration dans la signature de classe

9/13

(12)

Objet, suite

Avec une variable Object, je peux référencer n’importe quelle instance:

1 O b j e c t o = new P o i n t ( 1 , 2 ) ;

2 O b j e c t o2 = new PointNomme ( 2 , 3 ," t o t o ") ;

... Mais je ne peux (presque) rien faire sur o,o2

3 S y s t e m . o u t . p r i n t l n ( o . t o S t r i n g ( ) ) ; // OK

4 S y s t e m . o u t . p r i n t l n ( o . g e tX ( ) ) ; // KO

5 S y s t e m . o u t . p r i n t l n ( o . g e tY ( ) ) ; // KO

6 S y s t e m . o u t . p r i n t l n ( o2 . getNom ( ) ) ; // KO

Je peux donc créer un tableau/ArrayList avec n’importe quoi dedans:

7 O b j e c t [ ] t a b = new O b j e c t [ 1 0 ] ;

8 t a b [ 0 ] = " t o t o ";

9 t a b [ 1 ] = 1 0 ; // a u t o b o x i n g

10 t a b [ 2 ] = new P o i n t ( 1 , 2 ) ;

10/13

(13)

Arguments de méthode

1 // d a n s n ’ i m p o r t e q u e l l e c l a s s e , p a r e x e m p l e Truc

2 p u b l i c v o i d maMethode ( P o i n t p ) {

3 . . .

4 }

5

6 // i n v o c a t i o n s p o s s i b l e s :

7 Truc t = new Truc ( ) ;

8 t . maMethode (new P o i n t ( 1 , 2 ) ) ;

9 t . maMethode (new PointNomme ( 1 , 2 , " t o t o ") ) ;

10 t . maMethode (new C l a s s e H e r i t a n t D e P o i n t ( ) ) ;

Idée:

Comme tous les descendants de Point sont des Point...

⇒Toutes les informations utiles/nécessaires et toutes les méthodes clientes sont disponibles

⇒ aucun problème technique en perspective !

11/13

(14)

Le cas de la méthode equals

1 // E x e m p l e de l a c l a s s e P o i n t

2 p u b l i c b o o l e a n e q u a l s ( O b j e c t o b j ) {

3 i f (t h i s == o b j )

4 r e t u r n t r u e;

5 i f ( o b j == n u l l)

6 r e t u r n f a l s e;

7 i f ( g e t C l a s s ( ) != o b j . g e t C l a s s ( ) )

8 r e t u r n f a l s e;

9 P o i n t o t h e r = ( P o i n t ) o b j ;

10 i f ( x != o t h e r . x )

11 r e t u r n f a l s e;

12 i f ( y != o t h e r . y )

13 r e t u r n f a l s e;

14 r e t u r n t r u e;

15 }

Tous les objets sont comparables entre eux ! On peut donc rechercher un objet en particulier dans un tableau exploitant le polymorphisme:

1 A r r a y L i s t <O b j e c t > t a b =

2 new A r r a y L i s t <O b j e c t > ( ) ;

3 t a b . add ( " t o t o ") ; t a b . add ( 1 0 ) ;

4 t a b . add (new P o i n t ( 1 , 2 ) ) ;

5 t a b . add (new PointNomme ( 2 , 3 ," t i t i ") ;

6

7 t a b . c o n t a i n s (new P o i n t ( 1 , 2 ) ) ; // t r u e

8 // methode e x p l o i t a n t e q u a l s

Question suitante: comment passer d’un Object (générique) à une classe spécifique (ici : Point)?

⇒ réponse dans le cours sur l’opérateur cast

12/13

(15)

Conclusion et limites

Le principe de subsomption est ce qui fait l’intérêt de l’héritage:

stockage d’instances hétérogènes dans des structures de données (type liste), application des méthodes en batch sur toutes ces données.

... A condition d’avoir bien réfléchi à l’architecture, aux méthodes communes des différentes classes !

Enfin, attention à ne pas s’emmêler: si A EST UN B alors B n’est pas un A. La subsomption ne marche que dans un sens.

13/13

Références

Documents relatifs

Plusieurs DESCRIPTEURS peuvent être utiles pour décrire un même objet (par exemple des descripteurs permettant de caractériser un contact : nom, prénom, adresse et

Recoupement de voisinages : approche basée sur les graphes. [Boyer et

Large regions tend to have smaller p-values while small regions tend to have higher percentage of enrichment. → A smaller region included in a more significant one is pertinent if

Candidate gene prioritization by genomic data fusion.. • Observation: more and more post-genomic

Pour ne pas nuire au fil conducteur de ce mé- moire, nous avons reporté en annexe tous les travaux effectués pendant la thèse qui ne sont pas directement en rapport avec

….... Jean prête sa clé à Manuel qui doit lui copier dessus une vidéo de 2 Go. Est-ce que Manuel peut copier sa vidéo sur la clé ? Justifier la réponse. Ilyes a estimé qu'une

La technologie utilisée pour construire un Système de Gestion de Base de Données (SGBD) a des applications dans tout système qui doit stocker les données de manière persistante et