Bonjour. Bienvenue dans cette quatrième séquence sur l'héritage
et le lookup.
Dans cette séquence nous allons voir ce qui se passe
quand l'algorithme de lookup ne trouve pas une méthode
correspondante à un message.
Alors on va voir que le code, les classes, sont capables
d'ajouter du traitement pour traiter le fait qu'
un message aurait été envoyé et qui n'aurait pas été compris.
Si je reviens rapidement sur l'envoi de messages.
On envoie le message Area à l'objet colored rectangle.
L'algorithme de lookup a pour but de trouver la méthode à
exécuter par rapport à ce message là, donc l'algorithme
de lookup cherche dans la classe du receveur, c'est-à-dire
colored rectangle, une méthode qui s'appelle Area, s'il
la trouve, il l'exécute.
Là il ne la trouve pas donc l'algorithme de lookup va
aller voir dans la superclasse. La méthode Area est
trouvée et elle est exécutée sur le receveur.
Alors qu'est-ce-qui se passe s'il n'y a pas de méthode
Area du tout, et que algorithme de lookup échoue?
Alors dans ce cas-là on envoie le message "Coucou" à l'objet
node 1. Il n'y a pas de méthode Coucou implémentée, donc
l'envoi de message se passe comment ?
On envoie le message Coucou à node 1, on cherche Coucou
dans la classe node il n'est pas trouvé, l'algorithme de
lookup cherche Coucou dans la classe object, il n'est pas trouvé.
À ce moment-là, la machine virtuelle FARO envoie le
message does not understand au receveur donc
à node 1. Donc does not
understand avec le message initial en paramètres, donc
avec un coucou stef en paramètre.
Ici, si je le refais étape par étape, coucou est envoyé à
node 1, Coucou est cherché dans la classe node, Coucou
est cherché dans la classe object, la méthode Coucou n'existe
pas donc le message does not understand est envoyé à l'objet
node 1.
Donc l'algorithme de lookup va chercher une méthode does
not understand dans la classe de node 1.
Does not understand n'est pas trouvé dans la classe node
donc l'algorithme de lookup charge does not understand
dans la super classe, la méthode does not understand est
trouvée ou une méthode does not understand est trouvée
dans la classe object, elle est exécutée.
Donc qu'est ce que ça signifie ça ?
Ça signifie que dans toutes les sous-classes de la classe
object, on peut implémenter does not understand pour
avoir du comportement particulier qui va s'exécuter
lorsqu'un objet, une instance de cette classe ne comprend pas un message.
Donc sur ce slide vous avez les détails étape par étape
de cet exemple que vous pouvez relire.
Does not understand, c'est un message comme les autres.
Donc vous pouvez implémenter une méthode qui s'appelle
does not understand, et qui sera exécutée à chaque fois
qu'une instance ne comprendra pas un message.
On se sert de ce mécanisme dans certains cas un petit peu
compliqués comme les proxys, la délégation
automatique, c'est-à-dire lorsque vous voulez que tous
les messages que reçoit un objet soient transmis à un autre objet.
Dans ces cas-là on peut utiliser ce mécanisme de does not understand.
L'implémentation par défaut de does not understand se
trouve dans la classe object, et cette implémentation par
défaut lève une exception. Donc l'exception
s'appelle "message not understood".
Donc si la méthode does not understand de la classe
object est exécutée, une exception est levée.
Cela signifie que le code que vous écrivez peut capturer
cette exception, comme il capturerait n'importe quelle
exception, et peut y avoir du traitement particulier
lorsqu'un message n'est pas compris.
Dans cet exemple là, on revient sur la classe node, et
on a une méthode "say Hello" dans la classe node, qui
envoie le message Coucou au receveur donc à self.
On a aussi une méthode Welcome qui envoie le message "Say
hello" à self et qui fait un traitement particulier si
dans le contexte de cet envoi de message, si
un message n'est pas compris, il va y avoir du traitement.
Donc là say hello envoie le messageCoucou à self, Coucou
n'est toujours pas implémenté, donc au final la méthode
does not understand sera exécutée,
une exception sera levée, donc l'exception message not
understood sera levée. Le code qui est ici avec undo
sert à capturer les exceptions, c'est l'équivalent de try catch en Java.
Vous aurez une séquence plus tard qui vous parlera des exceptions en détail.
Mais là ce qui nous intéresse c'est de voir que ce
code-là, en fait, c'est l'équivalent du catch de Java,
donc c'est le code qui va être exécuté lorsque l'exception est capturée.
Donc si on envoie le message Welcome à node 1,
sachant que Coucou n'est pas implémenté, on affichera
dans la console le message something went wrong with the message.
Ce que vous devez retenir, c'est que
lorsque l'algorithme de lookup ne trouve pas une méthode
correspondante à un message qui est envoyé, un message
does not understand est envoyé au receveur initial avec
le message d'origine en paramètres.
Vous pouvez implémenter une méthode does not understand dans vos classes.
A défaut, l'implémentation par défaut dans la classe object sera exécutée.
Cette implémentation par défaut lève une exception, cette
exception s'appelle message not understood, et le code
que vous écrivez peut capturer cette exception et avoir
du traitement particulier lorsqu'un message n'est pas compris.