Buenos días a todos. En esta segunda secuencia sobre
la herencia, veremos en detalle la herencia del
comportamiento al enviar un
mensaje a un objeto.
El objetivo de esta secuencia es el de ver que pretenden
los mensajes, de comprender bien el algoritmo, de comprender
el algoritmo que permite convertir un mensaje enviado
a un receptor a través de un método, o que método sera
ejecutado en función de este mensaje enviado a tal receptor.
Y la semántica de self así pues que significa realmente self.
Como hemos visto en la secuencia anterior, la herencia
es estática para el estado, és decir cuando una subclase
es creada su estado es conocido en el momento de la creación
mientras que és dinámica para el comportamiento.
Es decir, que durante la ejecución, cuando enviamos un
mensaje a un objeto, miraremos cuales son los métodos
de la clase y cuales son los métodos de las diferentes súper clases.
Enviar un mensaje a un objeto se realiza en 2 etapas:
en la primera buscamos el método que corresponde a este mensaje.
En la segunda ejecutamos este método en el receptor.
Así aquí, tenemos la clase "Rectangle", la clase "ColoredRectangle".
Una instancia de la clase "ColoredRectangle" que se llama
aColoredRectangle y le enviamos el mensaje "area" a este
objeto.
Pues tenemos un algoritmo de búsqueda que buscara el
método correspondiente al mensaje área, que encontrara este método.
El cuerpo del método se ejecutara en función del
objeto aColoredRectangle.
El algoritmo de búsqueda "lookup" permite conocer el método a
ejecutar cuando un mensaje es enviado a un objeto.
Así aquí distinguimos entre enviar un mensaje a un objeto
y ejecutar un método, son 2
cosas realmente diferentes, que
són fundamentales en la programación orientada objeto, aunque usted
utilice otro lenguaje de programación és importante que comprenda
la diferencia entre envío de mensaje y ejecución de método.
Aqui enviamos el mensaje "área" al objeto
aColoredRectangle el algoritmo de búsqueda, la primera cosa
que hace es buscar en la clase del receptor.
Así el receptor del mensaje "área" es
aColoredRectangle, el algoritmo de búsqueda empezara
a buscar un método área a partir de la clase de este objeto.
És decir ColoredRectangle.
Buscamos un método área en esta clase de aqui.
El algoritmo de búsqueda no encontrara el método área
aquí, este no forma parte de los métodos definidos en
esta clase, así el algoritmo de búsqueda se dirigirá
hacia la súper clase, es decir la clase rectangulo.
el método área se encuentra aqui y lo devuelve.
El algoritmo de búsqueda a acabado su trabajo una vez
encuentra el método a ejecutar.
Estudiamos 2 casos, y revisamos el algoritmo que acabo de
mostrar en estos 2 casos.
Enviamos el mensaje "color" a "aColorRectangle".
Así pues el algoritmo busca en la clase del receptor un
método que se llama color.
Lo encuentra y lo devuelve.
Si en este momento enviamos el mensaje "área" a
aColoredRectangle el algoritmo busca en la clase del
receptor es decir aquí, un método que se llamaría
"área", como no lo encuentra mira en la súper clase.
Lo ha encontrado, el algoritmo de búsqueda devuelve este método.
self representa siempre al receptor.
A través de los siguientes ejemplos comprenderá
como el algoritmo de búsqueda se aplica
en todos los casos, y que self es sistemáticamente el receptor.
Así, aquí tenemos una instancia de la clase A
a la que enviamos el mensaje foo.
El algoritmo de lookup busca el método foo, y lo encuentra, y lo ejecuta.
Para B New, partimos aquí de E B, que es lo mismo que
B new, buscamos un método foo.
El algoritmo de búsqueda lo encuentra, lo ejecuta, devuelve 50 .
Aquí tenemos 10 y 50.
Es importante que se tome el tiempo necesario para reflexionar
sobre el significado de self.
2 puntos son importantes a describir; que representa self?
Como se comporta el envió de mensajes cuando un mensaje
es enviado al objeto self?
self y this, this en Java, self en Pharo, así pues es lo
mismo esto representa siempre el receptor del mensaje.
Aqui, este ejemplo lo hemos visto con A new foo y B new
foo, aquí enviaremos el mensaje bar.
Pues bar se enviá a una instancia, bar se encuentra aquí,
bar es ejecutado y enviamos el mensaje foo
al objeto Self.
Self es mi objeto que se encuentra aqui A new.
Así que buscamos un método foo a partir de este objeto,
es decir que buscaremos en un método en su
clase, lo hemos encontrado, lo ejecutamos, devuelve 10.
El otro caso es exactamente lo mismo, es necesario prestar
atención pues en este momento muchos principiantes de la
programación orientad a objetos se confunde.
Pero el algoritmo es exactamente el mismo.
Pues enviamos bar a este objeto, bar no se encuentra
aquí se encuentra aquí, es este bar el que sera ejecutado.
En este momento el mensaje foo es enviado a self.
Que és self? B pues B new.
Enviamos el mensaje foo a este objeto así que el algoritmo
Lookup busca un método foo en la clase de este objeto.
Encuentra este método foo, devuelve 50.
Así aquí tiene el comportamiento del algoritmo y puede
mirar etapa por etapa que esta pasando, que es
exactamente lo que acabo de contarle.
Este ejemplo también es idéntico al anterior.
La clase B aquí se encuentra vacía, una nueva clase
C se ha creado con un método foo que devuelve 50.
Usted desarrolla el algoritmo exactamente como se lo he
presentado y obtendrá aquí 10, 10,
es este foo el que sera finalmente ejecutado y aquí 50.
Acabando, self es el equivalente a this en Java
y representa siempre al receptor.
Enviar un mensaje a un objeto se desarrolla siempre en 2
etapas; en la primera, el algoritmo de Lookup busca
el metodo que corresponde al mensaje que se ha enviado.
en la segunda, el método encontrado se ejecuta en el receptor.
El algoritmo de búsqueda recorre la jerarquía a
a partir de la clase del receptor. El algoritmo de búsqueda
tiene el objetivo de encontrar el método que corresponde a un
mensaje enviado a un receptor.