Bonjour à tous. Dans cette seconde séquence sur l'héritage
nous allons voir plus en détails l'héritage de
comportement et qu'est-ce qui se passe quand on envoie un
message à un objet.
Donc le but de cette séquence c'est de voir l'envoi de
messages, de bien comprendre l'algorithme, de comprendre
l'algorithme qui permet de convertir un message envoyé à
un receveur vers une méthode, ou quelle méthode va être
exécutée par rapport à tel message qui est envoyé à tel receveur.
Et la sémantique de self donc qu'est-ce que self signifie vraiment.
Comme nous l'avons vu à la séquence précédente, l'héritage
et statique pour l'état, c'est-à-dire que lorsque la
sous- classe est créée son état est connu à la création
alors que pour le comportement c'est dynamique.
C'est-à-dire que durant l'exécution, lorsqu'on envoie un
message à un objet, on va aller regarder quelles sont les
méthodes de la classe et quelles sont les méthodes des super classes.
Envoyer un message à un objet se fait en 2 étapes:
première étape on cherche la méthode correspondante à ce message.
Deuxième étape on exécute cette méthode sur le receveur.
Donc là on a la classe "Rectangle", la classe "ColoredRectangle".
Une instance de la classe "ColoredRectangle" qui s'appelle
aColoredRectangle et on envoie le message "area" à cet
objet.
Donc on a un algorithme de lookup qui va chercher la
méthode correspondante au message area, qui va trouver cette méthode-là.
Le corps de la méthode va être exécuté par rapport
à l'objet aColoredRectangle.
L'algorithme de lookup permet de connaître la méthode à
exécuter quand un message est envoyé à un objet.
Donc ici on fait bien la distinction entre envois de
messages à un objet et exécutions de méthodes, ce sont 2
choses qui sont vraiment différentes, qui sont
fondamentales en programmation objet, même si vous
utilisez un autre langage c'est important de comprendre
la différence entre envois de messages et exécutions de méthodes.
Donc ici on envoie le message "area" à l'objet
aColoredRectangle l'algorithme de Lookup, la première
chose qu'il fait c'est qu'il va chercher la classe du receveur.
Donc le receveur du message "area" c'est
aColoredRectangle, l'algorithme de Lookup va commencer à
chercher une méthode area à partir de la classe de cet objet.
C'est-à-dire ColoredRectangle.
On cherche une méthode area dans cette classe-là.
L'algorithme de Lookup ne va pas trouver la méthode area
ici, elle ne fait pas partie des méthodes définies dans
cette classe-là, donc l'algorithme de Lookup va aller
voir dans la super classe, c'est-à-dire dans la classe rectangle.
La méthode area est trouvée ici et elle est retournée.
L'algorithme de Lookup a fini son travail une fois qu'il
a trouvé la méthode à exécuter.
On étudie 2 cas, on revoit l'algorithme que je viens de
vous lister sur ces 2 cas-là.
On envoie le message "color" à "aColorRectangle".
Donc l'algorithme cherche dans la classe du receveur une
méthode qui s'appellerait color.
Il la trouve, il la retourne.
Si maintenant on envoie le message "area" à
aColoredRectangle l'algorithme cherche dans la classe du
receveur c'est-à-dire ici, une méthode qui s'appellerait
"area", il ne la trouve pas il regarde dans la super classe.
Il la trouve, l'algorithme de Lookup retourne cette méthode.
self représente toujours le receveur.
Au travers des exemples qui vont suivre vous allez
comprendre vraiment que l'algorithme de Lookup s'applique
dans tous les cas, et que le self est systématiquement le receveur.
Donc ici on a une instance de la classe A
à qui on envoie le message foo.
L'algorithme de Lookup cherche la méthode foo, il la trouve, il l'exécute.
Pour B New, on part ici de E B, qui est la même chose que
B new, on cherche une méthode foo.
L'algorithme de Lookup la trouve, il l'exécute, 50 est retourné.
Donc ici on a 10 et 50.
C'est important que vous preniez le temps de réfléchir à
ce que self signifie exactement.
Donc 2 points sont importants à décrire: que représente self?
Comment se comporte l'envoi de messages lorsqu'un message
est envoyé à l'objet self ?
self et this, this en Java, self en Pharo, alors c'est la
même chose ça représente toujours le receveur du message.
Donc cet exemple on l'a vu avec A new foo et B New
foo, là on va envoyer le message bar.
Donc bar est envoyé à une instance, bar est trouvé ici,
bar est exécuté et on envoie le message foo
à l'objet Self.
Self c'est mon objet qui est là A new.
Donc on cherche une méthode foo à partir de cet objet-là,
donc c'est-à-dire on va chercher dans une méthode dans sa
classe, on la trouve, on l'exécute, 10 est retourné.
L'autre cas est exactement le même, il faut faire
attention par contre parce qu'à ce moment-là beaucoup de
débutants en programmation objets se trompent.
Mais l'algorithme est exactement le même.
Donc on envoie bar à cet objet-là, bar n'est pas trouvé
ici il est trouvé ici, c'est ce bar là qui s'exécute.
À ce moment-là le message foo est envoyé à self.
Self c'est quoi ? EB donc B new.
On envoie le message foo à cet objet donc l'algorithme de
Lookup cherche une méthode foo dans la classe de cet objet.
Cette méthode foo est trouvée, 50 est retourné.
Donc ici vous avez le déroulé de l'algorithme et vous
pourrez regarder étape par étape ce qui se passe, c'est
exactement ce que je viens de vous raconter.
Cet exemple-là est aussi identique au précédent.
La classe B ici est maintenant vide, une nouvelle classe
C a été créée avec une méthode foo qui retourne 50.
Vous déroulez l'algorithme exactement de la façon dont je
vous l'ai présenté et vous allez obtenir ici 10, 10,
c'est ce Fou-là qui est exécuté à la fin et ici 50.
En conclusion, self est l'équivalent 10 en Java
représente toujours le receveur.
Envoyer un message à un objet se déroule toujours en 2
étapes: première étape, l'algorithme de Lookup cherche
la méthode correspondante au message qui est envoyé.
Deuxième étape, la méthode trouvée est exécutée sur le receveur.
L'algorithme de Lookup va parcourir la hiérarchie à
partir de la classe du receveur. L'algorithme de Lookup
son but c'est de trouver la méthode correspondante à un
message qui est envoyé à un receveur.