Messages
du sujet
Conversion de classe |
boitex
Ville : BOIS GUILLAUME
Membre depuis : 22 mars 2004
Messages : 4
|
22 mars 2004 à 11:50
J'ai une question concernant les conversions de classe vers sous-classe. Si je suis ce qui est dit en page 68, l'exemple 3 montrarait qu'on ne peut convertir une objet d'une classe vers sa sous-classe que s'il pointe vers un objet étant déja de la sous-classe ???
Ce qui me laisse encore plus perplexe : page 70, si le commentaire disant "conversion de MessageRiche dans une référence de sa super-classe (...) est vraie, alors l'instruction "message.afficher()" de l'exemple 6 devrait afficher "Bonjour" !!! Pour moi, ce que je comprends, c'est que la référence message qui est de type MessageSimple est convertie en MessageRiche par l'instruction d'affectation (donc l'inverse de ce qui est dit dans le commentaire). --- O.BOITEUX
|
Manu
Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
|
22 mars 2004 à 15:27
>Si je suis ce qui est dit en page 68, l'exemple 3 montrerait qu'on ne peut convertir une objet d'une classe vers sa sous-classe que s'il pointe vers un objet étant déja de la sous-classe ???
Attention, on parle de conversion de références et pas de conversion d'objets. Une référence peut être convertie en une autre référence de type sous-classe uniquement si l'objet que désigne la référence est effectivement une instance de cette sous-classe ou si la référence est égale à null. Cette vérification n'est faite qu'à l'exécution. L'objet lui-même n'est quant à lui jamais converti, modifié ou alterré par cette opération.
> Ce qui me laisse encore plus perplexe : page 70, si le commentaire disant "conversion de messageRiche dans une référence de sa super-classe (...) est vraie, alors l'instruction "message.afficher()" de l'exemple 6 devrait afficher "Bonjour" !!! Pour moi, ce que je comprends, c'est que la référence message qui est de type MessageSimple est convertie en MessageRiche par l'instruction d'affectation (donc l'inverse de ce qui est dit dans le commentaire).
L'intruction message = messageRiche; affectant la valeur de la variable messageRiche à la variable message, ceci revient à dire que la référence de classe MessageRiche a été convertie en une référence de classe MessageSimple, la super-classe de MessageRiche. La conversion se fait ici dans le sens sous-classe vers super-classe et plus dans le sens super-classe vers sous-classe comme précédemment (ce qui impliquerait au passage d'écrire explicitement l'opérateur de cast). L'objet désigné par la variable message étant alors un objet de classe MessageRiche, la méthode appelée par l'instruction finale message.afficher(); est celle implémentée dans sa classe MessageRiche.
Peut-être vous êtes-vous laissé troublé par le nom des variables message et messageRiche trop proches dans cet exemple du nom de leur classe... --- Manu (moderator/modérateur)
|
boitex
Ville : BOIS GUILLAUME
Membre depuis : 22 mars 2004
Messages : 4
|
6 avr. 2004 à 10:22
OK. On est bien d'accord : en fait, il n'y a pas de conversion a proprement parler. Il y a une verification syntaxique à la compil que le type de la référence est compatible avec l'objet adressé (c'est-à-dire dans la même branche - super ou sous classe).
Par contre l'objet pointé, lui, ne change pas et conserve son comportement à l'execution.
C'est bien ça ? --- O.BOITEUX
|
Manu
Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
|
6 avr. 2004 à 23:10
> OK. On est bien d'accord : en fait, il n'y a pas de conversion a proprement parler.
C'est écrit en toutes lettres et même en italique page 67 ;-) :
"[Les conversions de référence] changent la classe d'une référence **sans transformer** ni la valeur de cette référence ni l'objet qu'elle désigne".
Le mot conversion est peut-être exagéré en effet, mais c'est pour faire le parallèle avec l'opérateur de conversion sur les types primitifs qui utilise la même syntaxe. Si vous avez une meilleure idée, je suis preneur..
> Il y a une verification syntaxique à la compil que le type de la référence est compatible avec l'objet adressé (c'est-à-dire dans la même branche - super ou sous classe).
Il y a vérification syntaxique à la compilation **et** vérification à l'exécution si la conversion de la référence se fait dans le sens super-classe vers sous-classe.
> Par contre l'objet pointé, lui, ne change pas et conserve son comportement à l'execution.
Il n'y a aucune opération capable de transformer en Java un objet en un autre, à part d'appeler une méthode qui créerait un nouvelle objet à partir d'un autre. --- Manu (moderator/modérateur)
|
boitex
Ville : BOIS GUILLAUME
Membre depuis : 22 mars 2004
Messages : 4
|
9 avr. 2004 à 11:15
Effectivement, c'est le mot conversion m'a un peu troublé notament page 70. Ne pourrait-on pas dire "Affectation de messageRiche dans une référence de sa super-classe..." Car en fait c'est la référence message qui change de comportement puisqu'elle pointe maintenant vers un objet de typeMessageRiche : ce serait plutot message qui a été converti !
le mot conversion : retypage ? (bof...)
-- je propose de ne pas passer le réveillon la-dessus, pour moi le sujet est clos ---- --- O.BOITEUX
|
Manu
Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
|
9 avr. 2004 à 16:33
> -- je propose de ne pas passer le réveillon la-dessus, pour moi le sujet est clos ----
D'ici le prochain réveillon, joyeuses pâques et merci pour vos remarques... ;-) --- Manu (moderator/modérateur)
|