Salut à tous. Dans ce cours, on va commencer à voir si
finalement vous avez bien compris ce qu'on a dit dans les autres cours.
En particulier sur super, là l'objectif est de vous faire
vraiment réfléchir et j'ai un petit test pour voir si vous avez compris.
Qu'est-ce que vous allez apprendre ?
Normalement, vous allez repenser à ce que c'est que
super, revoir la recherche des méthodes et réfléchir sur
ce que c'est qu'une méthode de classe.
Ça fait beaucoup pour un petit cours comme ça mais vous
allez voir, c'est assez sympa.
Imaginons que j'ai défini la méthode dans la classe Dice,
que j'ai redéfini la méthode new de la manière suivante.
J'ai écrit new et voilà le corps de la méthode, je fais
inst : = super new.
inst initialize return inst.
Et moi je vais exécuter l'expression Dice new.
Maintenant la question que je me pose et que je vous
pose, c'est que dans cette expression à quoi correspond
inst, à quoi correspond super et à quoi correspond super new?
Je vous laisse 5 secondes pour y réfléchir
et je vais vous donner quelques petites indications.
C'est basé sur mon expérience d'enseignement.
Non super, ce n'est pas la super classe.
Il faut vous l'enlever de la tête celui-là.
Non, inst n'est pas une instance de la super classe,
parce que si c'était le cas on ne pourrait jamais créer
des instances des classes qui sont dessous, ça serait quand même dommage.
Qu'est-ce que c'est ?
Finalement, ce qu'on avait dit dans le cours sur super, c'est
que super c'est le receveur du message.
Super pointe comme self sur le receveur du message et ça
n'est pas spécifique à Pharo, c'est dans tous les
langages objet comme Java, Sea sharp, Small talk.
Le message qu'on avait dit, c'était Dice new.
Quel est le receveur ?
Syntaxiquement c'est clair c'est Dice.
C'est la classe Dice.
Normalement avec cette indication-là vous devriez comprendre un peu mieux.
On va voir. Vous vous rappelez la recherche de la méthode
comment ça fonctionne ?
J'envoie un message à une instance, là coloredrectangle.
Je cherche premièrement dans la classe de
coloredRectangle si la méthode en question est définie,
là elle ne l'est pas, aire n'est pas définie.
Je la trouve ici, OK, très bien.
J'applique la définition que j'ai trouvée sur qui
? Sur le receveur. Là maintenant vous devez avoir compris
ce que fait cette méthode. Je vais chercher new dans la
classe de la classe Dice, je le cherche et je l'applique
sur la classe Dice.
On va voir ça de manière plus précise.
Ce que je vous disais, c'était que de toute façon dans
Pharo il n'y a qu'un seul envoi de messages et il n'y a
qu'une seule recherche de méthodes.
Quand j'envoie un message à quelque objet que ce soit, je
cherche toujours dans la classe, je suis toujours ce
lien-là, puis ce lien-là. C'est toujours 2 étapes aussi.
Qu'est-ce que ça donne dans notre système?
Super c'est le receveur.
Le receveur c'était la classe Dice.
Je cherche new dans la super classe de la classe Dice
class, là le point clé c'est que c'est Dice class et pas Dice.
On va le voir de manière graphique juste après.
Et une fois que j'ai trouvé ce nouveau new, je vais l'appliquer
sur le receveur qui était la classe Dice.
Ça va dire que new que j'ai trouvé quelque part je vais l'appliquer
sur Dice, donc ça va créer une nouvelle instance de la
classe Dice et ça va l'initialiser.
Donc inst va être ma nouvelle instance, donc 1D,
et je vais l'initialiser et je le rends.
Si on regarde de manière graphique, quand j'envoie new à
la classe Dice, je cherche où ?
Dans la classe de la classe Dice.
Donc je cherche dans Dice class, c'est là que j'ai
ma fameuse méthode.
Qu'est-ce que je dois faire ?
Super, c'est la classe
Dice, c'était le receveur la preuve, c'était écrit ici:
j'ai envoyé le message à cet objet-là.
Super me dit "Cherche au-dessus de la classe qui contient
l'expression", je cherche au-dessus de la classe
Dice class, donc je cherche ici.
Et quelque part ici au-dessus, on verra ça plus tard, new
est défini.
Qu'est-ce qu'on a dit sur le lookup ?
C'est qu'on trouve la méthode, elle est définie ici et on
l'applique sur le receveur. Je l'applique sur Dice,
ça va me rendre une nouvelle instance.
Là, je vais le faire graphiquement.
Ça me rend une petite instance: E dice.
Cette petite instance c'est inst qui pointe dessus.
Inst est un nouveau D.
Ensuite, je vais envoyer le message initialize à inst et
je le rends.
Souvent, vous avez des problèmes avec cet exemple parce
que cet exemple en particulier est assez retors, je le
fais exprès pour vraiment voir si vous avez compris.
Il va mélanger 2 choses, il va mélanger super qui est "Je
vais chercher au-dessus de la classe qui contient l'expression super.
Mais sachant que super c'est le receveur.
Et en plus new, c'est une méthode qui va créer des objets
" Là on voit qu'on est à la confluence de ces 2 choses et
qu'en général vous avez un problème à comprendre.
Je vous suggère de vraiment revoir cette séance parce que
c'est vraiment important de le comprendre.
Si je répète, super est le receveur du message qui en
fait est la classe Dice dans ce cas-là.
Je vais chercher au-dessus de la classe Dice class la
méthode new que je vais appliquer sur la classe Dice, qui
était le receveur,pour me donner une instance terminale.
En résumé, envoyer un message c'est chercher la méthode
dans la classe du receveur, c'est ce qu'on a fait comme d'habitude,
comme toujours. On ne peut faire que ça en Pharo, donc c'est
relativement simple. Maintenant, vous devez comprendre
que super, c'est chercher au-dessus de la classe qui
contient l'expression super, et que super c'est le
receveur et que ça peut être une classe aussi.
Mais là on ne va pas finir, j'ai un autre petit défi pour
vous parce que je pense que si vous suivez le cours
Pharo, c'est que vous voulez un peu avoir des défis.
Imaginons que j'ai la définition suivante, j'ai une
petite méthode qui me dit "Rends super espace class égal
égal self class. " Qu'est-ce que ça veut dire égal égal?
C'est l'identité de pointeur.
En fait je demande "Est-ce que l'objet qui est rendu par
l'expression super espace class est le même que l'objet
qui est rendu par self égal class ?"
Je définis cette méthode-là qui va me rendre soit vrai ou faux.
La question que je vous pose, c'est "Quel est le résultat
de A new foo"? Ça veut dire que je crée une nouvelle
instance de la classe A et je lui envoie le message foo
qui va exécuter ce message.
Quel est le résultat et pourquoi ?
Je vais vous laisser chercher parce que celui-là je ne
vous donnerai pas la réponse.