Hola todos. En la clase de hoy, vamos a ver
si has entendido nuestras clases anteriores
sobre todo en lo que se refiere a super.
La idea es hacerte pensar mucho.
Tengo una prueba para ver si lo has entendido.
¿Que aprenderás?
Pensarás sobre que es super,
revisarás la búsqueda de mensajes,
y pensarás en los métodos de clase.
Es mucho material para una clase, pero es divertido.
Imagina que definí un método en la clase Dice,
y redefiní el método "new" de la siguiente manera:
Aquí está "new" y aquí está el código.
inst:= super new
inst initialize. return inst.
Ahora ejecuto la expresión Dice new.
Ahora mi pregunta para ti es:
En esta expresión, ¿qué es inst?
¿Qué es super?
¿Y qué es super new?
Te daré unos segundos para pensarlo más.
Te daré algunas pistas.
Se basan en mi experiencia docente.
No, super no es la superclase.
Quita eso de tu cabeza.
No, inst no una instancia de la superclase.
Si lo fuera, nunca podríamos crear instancias de las clases debajo.
¿Qué es entonces?
Vamos a ver.
Dijimos en el video sobre super
ese super fue el receptor del mensaje.
Al igual que self, super apunta al receptor del mensaje.
Esto no es específico de Pharo.
Es cierto en todos los lenguajes orientados a objetos como Java, C#,
y Smalltalk.
Aquí el mensaje "Dice new".
Entonces, ¿cuál es el receptor? Sintácticamente hablando, es Dice.
La clase es Dice.
Con estas pistas, deberías entender mejor.
Veamos.
¿Recuerdas cómo funciona la búsqueda de mensajes?
Envío un mensaje a una instancia,
por ejemplo, ColoredRectangle.
Miro dentro de la clase ColorRectangle
para ver si el método en cuestión está definido. No lo está.
"Area" no está definida. Lo encuentro aquí.
Aplico la definición que encontré.
¿En que? En el receptor.
Ahora debes entender lo que hace este método.
Busco "new" en la clase Dice.
Lo busco y lo aplico a Dice.
Miremos más de cerca.
Como expliqué anteriormente,
en Pharo, solo se envía un mensaje con una búsqueda de método.
Entonces, cuando envío un mensaje a cualquier objeto que sea,
siempre miro en la clase. Sigo este enlace.
Entonces esta aquí.
Siempre son estos dos pasos.
¿Qué dice esto sobre nuestro sistema?
Te lo dije, super es el receptor.
El receptor era Dice.
Entonces busco "new" en la superclase de la clase Dice.
La clave aquí es que es la clase de Dice y no Dice.
Lo veremos gráficamente después.
Una vez que encuentre el nuevo "new"
lo aplico al receptor, que es Dice.
¿Qué hace esto?
Aplico new en Dice,
que creará e inicializará una nueva instancia de Dice.
Inst será mi nueva instancia.
Un dado.
Y lo inicializaré y lo devolveré.
Echemos un vistazo a un diagrama.
Cuando envío new a Dice,
donde busco? ¿En qué clase?
Me veo en la clase de Dice.
Aquí es donde uso mi famoso método.
¿Qué hago ahora? ¿Qué dijimos sobre super?
Super es la clase Dice. Es el receptor
Envié el mensaje a este objeto.
Super me dice que mire adentro
de la superclase de la clase que contiene la expresión.
Entonces miro en la superclase de la clase Dice.
Y busco aqui. Y en algún lugar aquí arriba,
que veremos más adelante,
donde se define new.
¿Qué pasa con la búsqueda?
Dijimos que el método se define aquí,
y lo aplicamos al receptor. Lo aplico a Dice.
Y esto me da una nueva instancia. Lo dibujaré.
Devuelve una instancia: un dado.
E inst es apuntado a esta nueva instancia.
Entonces, inst es un nuevo dado.
Envío el mensaje initialize a inst, y luego lo devuelvo.
A menudo luchas con este ejemplo. porque es muy retórico.
Lo hago a proposito para ver si lo has entendido.
Mezcla dos cosas.
Uno, super.
Miro en la superclase de la clase que contiene la expresión super,
sabiendo que super es el receptor.
Y dos, new. Es un método que crea objetos.
Aquí es donde los dos se encuentran,
y a ti te cuesta entender esto.
Sugiero que realmente revises esta lección,
porque es muy importante.
Lo repetiré.
Super es el receptor del mensaje,
que en este caso es Dice.
Busco en la superclase de la clase Dice el método new
que voy a aplicar a Dice, el receptor, para encontrar mi instancia final.
¿Entendido?
En resumen: enviar un mensaje está buscando un método en la clase del receptor.
Eso es lo que hacemos cada vez.
Eso es todo lo que puedes hacer en Pharo, por lo que es fácil.
Ya sabes que super significa buscar en la superclase de la clase
que contiene la expresión super.
Y ese súper es el receptor, pero también puede ser una clase.
Aún no hemos terminado. Tengo otro problema para ti.
Si estás estudiando Pharo, deben gustarte los desafíos.
Aquí vamos. Imagina que tengo el siguiente problema:
El método dice: "Make super class
== self class."
¿Qué significa "=="? Es la identidad del puntero.
De hecho, estoy preguntando: ¿Es el objeto obtenido
con super class idéntico
al objeto obtenido con self class ?
Definí este método, que devolverá verdadero o falso.
Mi pregunta para ti es:
¿Cuál es el resultado de A new foo?
Creo una nueva instancia de A
y le envío el mensaje foo, que editará este mensaje.
¿Cuál es el resultado y por qué?
Tendrás que pensar porque no te daré esta respuesta.