En un ambiente de objetos todo es un objeto, cadenas, números reales, números enteros, código fuente (instancias de CompiledMethod), clases y metaclases.
Como funciona el Meta Modelo en Smalltalk
Cuando creo una clase digamos Alfil (para simular un juego de ajedrez) se crean dos cosas:
1. La meta clase Alfil class
2. La clase Alfil
Alfil class y Alfil son dos cosas diferentes. Alfil class es la meta clase de la clase Alfil.
(o con el clásico ejemplo: Cliente class y Cliente)
La única instancia de Alfil class es Alfil. Es decir, que cada meta clase (en este ejemplo la meta clase Alfil class) tiene un única instancia (es un como un singleton), y esta instancia es la clase Alfil. Y las instancias de la clase Alfil son los alfiles que utilizo en la partida.
REGLAS
1. "Cada clase es instancia de su meta clase"
2. "Cada meta clase es instancia de la clase Metaclass"
Por cada clase que creo en mi modelo, Cliente, Factura, IVA, etc voy a tener la correspondiente meta clase: nombre de la clase + class.
Ahora bien, si todo es un objeto, que clase de objeto es una meta clase ?
Cada meta clase (Alfil class) es una instancia de la clase Metaclass (observar que es Metaclass solamente, sin el post fijo class), es decir, Metaclass es una clase.
Resumiendo tenemos que:
Mi clase Alfil es una instancia de Alfil class (que se crea cuando creo Alfil).
Además Alfil class es una instancia de Metaclass.
Esto nos lleva a una aparente "contradicción", que es interesante.
Por regla 1 entonces tendría que Metaclass es instancia de su meta clase pero por regla 2 cada meta clase es instancia de Metaclass.
El Meta Modelo de Smalltalk se apoya en esta aparente contradicción dónde Metaclass es instancia de Metaclass class (regla 1), y que Metaclass class es instancia de Metaclass (regla 2). Metaclass es una instancia de si misma, es casi filosófico (esto en broma claro, jajaja)
La jerarquía de clases es la siguiente:
Behavior
ClassDescription
Class
Metaclass
No hay comentarios:
Publicar un comentario