Buenos días. Bienvenidos a esta cuarta secuencia sobre la herencia
y la búsqueda.
En esta secuencia veremos que ocurre
cuando el algoritmo de búsqueda no encuentra el método
que corresponde a un mensaje.
Veremos que el código, las clases, son capaces
de incorporar el tratamiento necesario para tratar
un mensaje envíado no entendido.
Vuelvo rápidamente al envío de mensajes.
envíamos el mensaje area al objeto coloured rectangle.
El algoritmo de búsqueda tiene como objetivo encontrar el método a
ejecutar correspondiente a este mensaje, así pues el algoritmo
de búsqueda busca en la clase del receptor, es decir
ColoredRectangle, un llamado area y si
la encuentra, la ejecuta.
Aquí no lo encuentra así pues el algoritmo de búsqueda mirara
en la superclase. El método area
es encontrado y se ejecuta en el receptor.
Entonces que ocurre si no existe ningún método
area, y el algoritmo de búsqueda falla ¿?
En este caso se envía el mensaje "Coucou" al objeto node1.
¿No esta implementado el método Coucou, así que
que ocurre con el mensaje?
enviamos el mensaje Coucou a node1, buscamos Coucou
en la classe Node y no lo encuentra, el algoritmo de búsqueda
busca Coucou en la clase Object, y no lo encuentra.
En este momento, la maquína virtual de Pharo envía el
mensaje doesNotUnderstand al receptor
a node1. Así que doesNotUnderstand
con el mensaje inicial como parámetro, así que con un
coucou: stef como parámetro.
Aquí, si lo repito etapa a etapa, coucou se envía a
node1, Coucou se busca en la classe Node, Coucou se
busca en la clase Object, el método Coucou no
existe así que el mensaje doesNotUnderstandse envía al objeto node1.
Así que el algoritmo de búsqueda buscara un método
doesNotUnderstand en la clase de node1.
DoesNotUnderstand no se encuentra en la classe Node
así que el algoritmo de lookup carga doesNotUnderstand en
la super classe, el método doesNotUnderstand es encontrado
o un método doesNotUnderstand es encontrado Aquí
en la clase Object, y es ejecutado.
Así que significa esto?
Significa que todas las subclases de la clase
Object, pueden implementar doesNotUnderstand para tener un
un comportamiento particular al ejecutarse cuando un
objet, instancia de esta classe no comprenda un mensaje.
Así que en este slide tenéis los detalles etapa por etapa
ce este ejemplo que podéis volver a leer.
DoesNotUnderstand, es un mensaje como los demás.
Así que podéis implementar un método que se llama
doesNotUnderstand, que se ejecutara cada vez que una instancia de una
clase no comprende un mensaje.
Utilizamos este mecanismo en ciertos casos un poco complicados
como los proxys, la delegación
automática, es decir cuando queréis que todos
los mensajes que recibe un objeto sean transmitidos a otro objeto.
En estos casos podemos utilizar este mecanismo doesNotUnderstand.
La implementación por defecto de doesNotUnderstand se
encuentra en la clase object, y esta implementación por
defecto levanta una excepción. La excepción
se llama "MessageNotUnderstood".
Así que si el método doesNotUnderstand de la clase Object
se ejecuta, se levantara una excepción.
esto significa que el codigo que escribáis puede capturar
esta excepción, como si capturara cualquier otra
excepción y puede tener un trato particular
cuando no se comprende un mensaje.
En este ejemplo, volvemos sobre la clase Node, y
tenemos un método "sayHello" en la clase Node, que
envía el mensaje Coucou al receptor es decir self.
También tenemos un método Welcome que envía el mensaje
"Sayhello" a self y que realiza un tratamiento particular
si en el contexto de este envío de mensaje,
un mensaje no se comprende, tendrá un comportamiento particular.
Así que Aquí hello envía el mensaje Coucou a self, Coucou
aun no se ha implementado, así que al fina el método
doesNotUnderstand sera ejecutado,
una excepción se levantara, la excepción messageNotUnderstood.
El código que se encuentra Aquí con undo sirve para capturar las
excepciones, es el equivalente a un try catch en Java.
Tendréis una secuencia mas tarde que os hablara de las excepcione en detalle.
Pero Aquí lo que nos interesa es de ver que este
código, de hecho, es el equivalente de un catch de Java,
así que este código sera ejecutado cuando se la excepción se capture.
Si enviamos el mensaje Welcome a node1,
sabiendo que Coucou no esta implementado, mostraremos
en la consola el mensaje alguna cosa ha ido mal con el mensaje.
Lo que tenéis que recordar, es que
cuando el algoritmo de búsqueda no encuentra un método
que corresponde a un mensaje enviado, un mensaje
doesNotUnderstand se envía al receptor inicial con el
el mensaje original como parámetro.
podéis implementar un método doesNotUnderstand en vuestras clases.
Por defecto, se ejecutara la implementación por defecto en la clase Object.
Esta implementación por defecto levanta una excepción, esta
excepción se llama messageNotUnderstood, y el vuestro
código puede capturar esta excepción y tener un
trato particular cuando no se comprenda un mensaje.