Hola, este es un curso muy avanzado.
Nos centraremos en como Pharo organiza clases
y relaciones de instancia entre clases.
Está realmente dirigido a los entusiastas.
No es esencial dominarlo, ya que ya usas Pharo sin él.
Puedes usar Pharo para programar sin saber cómo funciona.
Pero puede estar insatisfecho si el curso no explicó cómo funciona.
Como explicar dónde se define "new"
o cuál es la clase de una metaclase.
Este video explicará todo esto.
No importa si no lo entiendes inmediatamente.
Pero si realmente te interesa,
puedes verlo varias veces.
Hay una clave fundamental aquí.
Es un aspecto divertido, que esta transparencia debería explicar.
La idea básica,
que seguimos reiterando en este MOOC,
es que, como debes saber, cuando enviamos un mensaje a un objeto,
buscamos en la clase del objeto a través del enlace de instanciación.
Si no está allí, seguimos la cadena de herencia.
Siempre comenzamos en la clase, y luego seguimos la cadena de herencia.
Esta regla debe seguirse sistemáticamente.
Para explicar metaclases,
las resumimos en siete puntos, que son relativamente simples
Cada objeto es una instancia de una clase.
¡Eso es difícil! Mira este ejemplo.
El objeto OrderedCollection es una instancia de esta clase.
Hasta ahora, está claro.
El segundo punto es que cada clase hereda de la clase Object.
Como vemos aquí,
OrderedCollection y hacia arriba heredan en última instancia de Object.
Solo una nota para los francófonos,
"Eventualmente" significa "en última instancia".
Es confuso.
Asi que,
tenemos nuestro gráfico de herencia que inevitablemente conduce a "Object".
¿Cuál es la responsabilidad de Object? Representa el comportamiento
común a todos los objetos, como el manejo de errores,
insertar un halt y announcements.
Object es la raíz del árbol de herencia.
Su responsabilidad clave es el comportamiento mínimo.
Volviendo a nuestra lista, cada clase es una instancia de una metaclase.
Lo explicamos en un curso anterior.
Una clase "X" es la única instancia de la metaclase denominada "X class".
Vemos que la clase OrderedCollection
es una instancia de la clase "OrderedCollection class".
Funciona de la misma manera para la clase SequenceableCollection,
y la clase "Object" con la clase "Object class".
Todas las clases son instancias de otra metaclase,
que lleva el mismo nombre seguido de "class".
Las metaclasses se crean
automáticamente cuando creamos una clase.
Enviamos el mensaje "new" a la metaclase para crear la clase.
El siguiente punto.
La jerarquía de metaclases es paralela a la jerarquía de clases.
Anteriormente, explicamos que
OrderedCollection es una instancia de su clase,
y del mismo modo para SequenceableCollection.
Ahora tenemos que especificar la relación entre los dos.
Ya que hay una relación de herencia aquí, también hay una aquí.
En todos los casos.
Es por eso que decimos que hay dos jerarquías paralelas.
¿Cuándo usamos esta jerarquía?
Si envío el mensaje "new" a OrderedCollection,
¿donde busco? En la clase.
Busco en cada clase si se ha definido o no "new".
Al moverse hacia arriba, ¿se ha definido "new"? Si o no.
Aquí utilizamos la clave que mencioné al principio.
Para enviar un mensaje, comienza con la clase luego sigue la cadena de la herencia.
Hasta este punto,
Puede parecer claro, pero ahora surgen otras preguntas.
¿De qué es instancia "Object class"?
Quizás te preguntes.
¿Y cual es la superclase de "Object class"?
¿Funciona si enviamos un mensaje a una metaclase?
¿O si enviamos un mensaje a lo que este aquí?
Echemos un vistazo.
El sistema dice que cada metaclase hereda de "Class",
hasta "Behavior".
Veamos eso, y respondamos la primer pregunta.
"Object class" es una clase, por lo tanto, hereda de "Class".
"Class" hereda de "ClassDescription" y "Behavior".
A diferencia de Pharo, en otros sistemas como Lisp
estos dos elementos son una sola clase.
Pharo los divide para su reutilización.
"Metaclass" se puede adjuntar a "ClassDescription"
para utilizar "ClassDescription" en los dos casos.
Vemos que "Behavior", que representa la esencia de una clase,
hereda de "Object".
Entonces, si envío un mensaje aquí,
viajará todo el camino hasta aquí.
Sigue el árbol de herencia desde el nivel de "Class".
Ahora queremos saber donde se define "new".
El método para crear instancias se define en "Behavior".
Cuando envío el mensaje "new" a OrderedCollection, ¿qué sucede?
Primero, busco en la clase.
Supongamos que "new" no se redefine en la herencia,
entonces busco en todas las superclases
hasta que encontremos "new".
En una búsqueda, buscamos un método y lo ejecutamos en el receptor.
Entonces, encuentro el método "new" y lo ejecuto en el receptor,
la clase OrderedCollection, que crea una nueva instancia
que nombraremos 3 4, por ejemplo.
¿Bien?
Estamos usando la clave de la que hablé.
Buscamos en la cadena de herencias, comenzando con la clase del receptor.
En una palabra, ¿Qué representa "Behavior"?
Es la esencia de un objeto que puede tener instancias
Objetos con instancias
deben incluir un enlace de superclase,
un diccionario de métodos y la descripción de instancias (formato).
Los métodos que se muestran aquí incluyen ejemplos como "new', "basicNew" y "new:".
La diferencia entre "new" y "basicNew".
es que nunca debes redefinir basicNew.
Como explicamos en el curso de métodos,
si redefine un método que comienza con "basic", el método es inaccesible.
El método original.
Hay otras formas de acceder los métodos compilados, como se muestra aquí.
Behavior es la esencia de una clase.
¿Qué es ClassDescription?
Es una superclase abstracta compartido por Class y Metaclass.
Añade facilidades a Behavior,
como nombrar variables de instancia, ya que la ejecución de clases puede ser automática.
ClassDescription agrega estas cosas.
La organización en categorías se refiere a los métodos en su navegador mostrando los protocolos.
Por ejemplo, un método se puede almacenar en el protocolo "printing".
Además, la noción de un nombre.
Más el mantenimiento de los conjuntos de cambios y el guardado de los cambios en archivos.
Puedes verlo tú mismo.
Esta categorización existe porque Class y Metaclass comparten el uso.
La responsabilidad de Class
es representar las clases que empleamos en Pharo.
Esto incluye representación para nombres de variables de clase
y una mejor forma de nombrar y compilar elementos.
Una vez más, consulte el código.
Las clases son instancias de metaclases.
Si "Object" es una instancia de una clase denominada "Object class",
y del mismo modo para OrderedCollection,
lo mismo se aplica a "Class", "ClassDescription" y "Behavior".
Entonces, "Class" es una instancia de "Class class"
y "ClassDescription" es una instancia de "ClassDescription class".
Lo mismo se aplica a "Behavior".
También debemos mirar la cadena de herencias.
Si hay una relación de herencia entre estos dos elementos,
existe la misma relación aquí a la derecha.
Como ves aquí, podemos rastrear la cadena de herencia.
"Behavior class" hereda por lo tanto de "Object class".
Ahora por el segundo último punto.
Como cada clase es una instancia de una metaclase, surge una pregunta.
¿De quien es instancia "OrderedCollection class"?
Ya que todo es un objeto en Pharo.
"OrderedCollection class" es por lo tanto una instancia de "Metaclass".
"Object class" y "Class class" son instancias de "Metaclass".
Todas las metaclases en el sistema son instancias de "Metaclass".
Además, "Metaclass" hereda de "ClassDescription".
Es una clase inusual porque solo tiene una instancia.
Y no puedes nombrarlo porque su nombre está definido por su instancia.
Eso puede parecer bárbaro.
Entonces, vemos que OrderedCollection
es una instancia de "OrderedCollection class", de quien toma su nombre.
Todas los metaclases son instancias de Metaclass.
En el codigo, la principal responsabilidad de Metaclass
es crear e inicializar una sola instancia de sí misma.
Solo hay una pregunta por contestar
¿De quien es instancia "Metaclass"?
Como Metaclass es una clase, como OrderedCollection,
es una instancia de la clase "Metaclass class".
Verás que Metaclass hereda de ClassDescription,
por lo tanto, "Metaclass class" hereda de la "ClassDescription class".
OrderedCollection class hereda de Object class
como OrderedCollecton hereda Object.
Entonces, "Metaclass" es una instancia de "Metaclass class".
OrderedCollection es una instancia de "OrderedCollection class".
Y "Metaclass class" es una instancia de "Metaclass",
tal como "Class class" y "Object class" son instancias de "Metaclass".
Este ciclo puede parecer extraño, pero tiene sentido en contexto.
No necesitas esto para usar Pharo, así que siéntete libre de pasarlo por alto.
Pero como muestra este gráfico,
la clave de la que hablamos antes funciona perfectamente.
Cada vez que enviamos un mensaje a un objeto, vemos su clase
y su árbol de herencia, como se muestra en estos ejemplos.
Si envío un mensaje a esta instancia, me lleva a Object.
Si envío un mensaje a la clase,
Voy a la metaclase y sigo la herencia.
Si envío un mensaje a una metaclase, ¿Dónde debo mirar?
En "Metaclass", ya que la metaclase es una instancia de Metaclass.
Sigo el enlace de instanciación hasta el final.
Esto es, cuando un mensaje no se entiende o un método solo se define en Objeto.
Ahora, ¿qué pasa si envío un mensaje? a Metaclass?
¿Dónde busco?
Primero en "Metaclass class", luego sigo la cadena de herencia.
Entonces ... ¡vaya!
Aquí se vuelve más complicado.
De manera similar, si envío un mensaje a "Metaclass class",
o a "OrderedCollection class",
Miro en la instancia
de "Metaclass class", que es "Metaclass".
Al igual que para "OrderedCollection class", sigo ese camino.
Ya verás que este gráfico es completamente lógico.
No podemos tener un gráfico inconsistente
ya que la máquina virtual solo hace una cosa.
Busca mensajes en la clase y sigue la cadena de herencia.
Este gráfico completo es consistente con ese proceso.
Encuentro esto emocionante porque me lo pregunté yo mismo.
Entonces, para resumir, las clases son objetos y pueden recibir mensajes.
El procedimiento es el mismo para todos los objetos,
incluso si hay metaclases con una sola instancia,
que no están explícitamente nombradas.
Pero no es esencial saber eso.