Clase del 30/08/2007 (Diseño Avanzado con Objetos)

De Cuba-Wiki

Metaclasses

Una clase cuyas instancias son también clases es llamada “metaclase”.

En versiones anteriores de Smalltalk, existía solo una metaclase llamada Class. La dificultad de esto es que el protocolo de todas las clases estaba restringido a ser el mismo, ya que estaba especificado en un solo lugar.

Smalltalk-80 quita esta restricción, haciendo que cada clase sea instancia de su propia metaclase. Cuando una clase es creada, se crea automáticamente una nueva metaclase. Las metaclases son diferentes de las demás clases porque no son instancias de otras metaclases; son instancias de la clase llamada Metaclass. Además las metaclases no tienen nombres. Una metaclase puede ser accedida enviando a su instancia el mensaje unario class.

En Smalltalk-80, Class es una superclase abstracta de todas la metaclases. Class describe la naturaleza general de las clases. Cada metaclase agrega el comportamiento específico de su instancia. Cuando las metaclases se agregaron a Smalltalk-80, se hizo un gran cambio en la organización de clases. La jerarquía de subclases de las metaclases son una jerarquía paralela de la jerarquía de subclases de las clases que son sus instancias.

La clase abstracta llamada ClassDescription describe las clases y sus instancias. Class y Metaclass son subclases de ClassDescription. La superclase de la metaclase de Object es Class. Las metaclases heredan de Class su protocolo de creación de instancias.

Cuando una clase es creada, son creadas sus variables de clase con sus valores en nil. Las metaclase generalmente definen métodos que inicializan las variables de clase.

La variables de clase son accesibles desde se clase y su metaclase. La asignación de valores a las variables de clase puede hacerse en los métodos de clase, más que indirectamente vía mensajes privados en los métodos de instancia.