• Aucun résultat trouvé

2I002 EGALITÉ ENTRE OBJETS, CLONAGE D’OBJET

N/A
N/A
Protected

Academic year: 2022

Partager "2I002 EGALITÉ ENTRE OBJETS, CLONAGE D’OBJET"

Copied!
10
0
0

Texte intégral

(1)

2I002

EGALITÉ ENTRE OBJETS, CLONAGE D’OBJET

Vincent Guigue & Christophe Marsala

(2)

Problématique

Le signe = se comporte de manière spécifique avec les objets...

Le signe == également spécifique avec les objets...

Vocabulaire (uniquement pour les opérations sur objets) new Instanciation / Création d’instance

= Création de référence

== Egalité référentielle

double x = 1 double y = 2

Point Point p

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

2 P o i n t q = p ;

3 P o i n t r = new P o i n t ( 1 , 2 ) ;

4 S y s t e m . o u t . p r i n t l n ( ( p==q ) +" ␣ " + ( p==r ) ) ;// t r u e f a l s e

(3)

Problématique

Le signe = se comporte de manière spécifique avec les objets...

Le signe == également spécifique avec les objets...

Vocabulaire (uniquement pour les opérations sur objets) new Instanciation / Création d’instance

= Création de référence

== Egalité référentielle

double x = 1 double y = 2

Point Point p

Point q

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

2 P o i n t q = p ;

3 P o i n t r = new P o i n t ( 1 , 2 ) ;

4 S y s t e m . o u t . p r i n t l n ( ( p==q ) +" ␣ " + ( p==r ) ) ;// t r u e f a l s e

(4)

Problématique

Le signe = se comporte de manière spécifique avec les objets...

Le signe == également spécifique avec les objets...

Vocabulaire (uniquement pour les opérations sur objets) new Instanciation / Création d’instance

= Création de référence

== Egalité référentielle

double x = 1 double y = 2

Point

Point p

Point q double x = 1

double y = 2

Point

Point r

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

2 P o i n t q = p ;

(5)

Comment dupliquer une instance?

Idée (assez raisonnable somme toute)

Créer une nouvelle instance dont les valeurs des attributs sont identiques Exemple de code : clonage de Point

1 // Ou p l a c e r l e c o d e ?

2 p u b l i c c l a s s P o i n t {

3 // Q u e l l e s i g n a t u r e de methode ?

4 p u b l i c P o i n t c l o n e ( ) {

5 r e t u r n new P o i n t ( x , y ) ;

6 }

7 }

Usage:

1 // main

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

3 P o i n t p2 = p . c l o n e ( ) ;

NB: construction de nouvelle instance sans

new

explicite dans le

main

(6)

Comment dupliquer une instance?

Idée (assez raisonnable somme toute)

Créer une nouvelle instance dont les valeurs des attributs sont identiques Exemple de code : clonage de Point

1 // Ou p l a c e r l e c o d e ?

2 p u b l i c c l a s s P o i n t {

3 // Q u e l l e s i g n a t u r e de methode ?

4 p u b l i c P o i n t c l o n e ( ) {

5 r e t u r n new P o i n t ( x , y ) ;

6 }

7 }

Usage:

1 // main

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

3 P o i n t p2 = p . c l o n e ( ) ;

NB: construction de nouvelle instance sans

new

explicite dans le

main

(7)

Comment dupliquer une instance?

Idée (assez raisonnable somme toute)

Créer une nouvelle instance dont les valeurs des attributs sont identiques Exemple de code : clonage de Point

1 // Ou p l a c e r l e c o d e ?

2 p u b l i c c l a s s P o i n t {

3 // Q u e l l e s i g n a t u r e de methode ?

4 p u b l i c P o i n t c l o n e ( ) {

5 r e t u r n new P o i n t ( x , y ) ;

6 }

7 }

Usage:

1 // main

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

3 P o i n t p2 = p . c l o n e ( ) ;

(8)

Clonage : syntaxe alternative

Avant le JAVA, il y avait le C++

En C++ : la syntaxe standard = constructeur de copie Exemple de code dans la classe Point

1 // C o n s t r u c t e u r de P o i n t a p a r t i r d ’ un a u t r e P o i n t

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

3 t h i s. x = p . x ; // t h i s f a c u l t a t i f

4 t h i s. y = p . y ; // t h i s f a c u l t a t i f

5 }

Usage:

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

2 P o i n t p2 = new P o i n t ( p ) ;

Résultat ABSOLUMENT identique (depuis JAVA 1.5)

Avantage du clone en JAVA: il s’agit d’une méthode standard (= + facile à lire)

(9)

Comment tester l’égalité structurelle?

Créer une méthode qui teste l’égalité des attributs Solution 1 (simple mais pas utilisée)

1 // Dans 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 g a l i t e ( P o i n t p ) {

3 r e t u r n p . x == x && p . y == y ;

4 }

5 // e q u i v a l e n t s i m p l i f i e de

6 // i f ( p . x == x && p . y == y )

7 // r e t u r n t r u e

8 // e l s e

9 // r e t u r n f a l s e ;

1 // Dans l e main

2

3 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ;

4 P o i n t p2 = p1 ;

5 P o i n t p3 = new P o i n t ( 1 . , 2 . ) ;

6 P o i n t p4 = new P o i n t ( 1 . , 3 . ) ;

7

8 p1 . e g a l i t e ( p2 ) ; // t r u e

9 p1 . e g a l i t e ( p3 ) ; // t r u e

10 p1 . e g a l i t e ( p4 ) ; // f a l s e

public boolean egalite(Point p) produit le résultat attendu ATTENTION à la signature:

la méthode retourne un booléen

la méthode ne prend qu’un argument

(10)

Méthode standard: boolean equals(Object o)

equals existe dans tous les objets (comme toString)

mais teste l’égalité référentielle... Pas intéressant (comme toString)

⇒ Redéfinition = faire en sorte de tester les attributs Un processus en plusieurs étapes:

1

Vérifier s’il y a égalité référentielle / pointeur null

2

Vérifier le type de l’Object o (cf cours polymorphisme)

3

Convertir l’Object o dans le type de la classe (idem)

4

Vérifier l’égalité entre attributs

1 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 ) {

2 i f (t h i s == o b j ) r e t u r n t r u e;

3 i f ( o b j == n u l l) r e t u r n f a l s e;

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

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

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

7 i f ( x != o t h e r . x ) r e t u r n f a l s e;

8 i f ( y != o t h e r . y ) r e t u r n f a l s e;

9 r e t u r n t r u e;

10 }

Références

Documents relatifs

Sans échelle (pour l’instant) on représente deux forces de même valeur, de direction verticale, et de sens opposés, appliquées l’une au centre de gravité du ballon

– et d’e↵ectuer les instructions n´ecessaires pour la cr´eation d’un objet de cette classe Les constructeurs sont appel´es quand on cr´ee (mot-cl´e new) un objet de cette

On ne peut pas utiliser l’opérateur « point » (.) sur les variables de la classe Chien ailleurs que dans la classe Chien

‣ Un tableau est une structure de données contenant un groupe d'éléments tous du même type. ‣ Le type des éléments peut être un type primitif ou

Cette méthode retourne vrai s’il existe une l’intersection ainsi que le point d’intersection faux, dans le cas contraire..  Une classe Droite constituée d’un Point et

 Lorsque vous sautez d’un plongeoir ou d’une chaise, vous tomber du fait de votre poids car la pesanteur terrestre vous fait tomber vers le sol. S’il n’y avait aucun

Donner des noms explicites (classes, méthodes, attributs) Développer une documentation du code (cf cours

En Java l’instanciation d’un objet se fait en deux étapes : 1 : Définition d’une variable du type de la classe désirée.. String uneChaine ; /* Déclare qu’il y aura un