Smalltalk superclasse vs métaclasse?
j'ai du nouveau à la programmation orientée objet, mais avec une "procédure" d'arrière-plan.
j'essaie actuellement de faire tourner la tête autour de OOP via GNU Smalltalk et"Smalltalk: Getting The Message" de Lovejoy.
je suis confus quant à l'enfer de la classe metaclass et Metaclass sont, vs superclass. Je peux voir le flux héréditaire de la superclasse - > classe - > sous-classe; mais je ne vois pas comment/où la métaclasse s'intègre. TIA...
4 réponses
il y a une excellente description dans le livre gratuit en ligne Pharo par exemple , chapitre 13 (Classes et métaclasses). Les choses expliquées dans ce chapitre sont communes à toutes les implémentations Smalltalk.
il y a en fait deux niveaux d'héritage: l'héritage d'instance et l'héritage de classe.
Smalltalk a un schéma spécial qui permet de faire circuler classes comme objets. Cela signifie que les classes sont aussi des objets de leurs propres droits. La métaclasse est "simplement" la classe de l'objet de classe.
il n'interfère pas avec l'héritage d'instance normale, de sorte qu'il ne rentre pas n'importe où dans le diagramme superclass -> class -> subclass
que vous avez utilisé.
il y a deux relations différentes relations en OO de classe: instantiation et héritage .
Instanciation est la relation entre un objet et sa classe , le new
mot-clé, etc. Habituellement, il est mis en œuvre par un pointeur dans la représentation de bas niveau de n'importe quel objet. Dans Smalltalk, anObject class
traverse ce pointeur; il est également il arrive que les classes soient aussi des objets, et que les classes soient appelées métaclasses, mais c'est la même relation qu'avec les instances.
héritage est une relation entre les classes . Vous pouvez passer d'une classe à sa superclasse en faisant aClass superclass
, et continuer à le faire jusqu'à ce que vous arriviez à la classe Object
. Dans Smalltalk, le pointeur superclass est juste une variable d'instance définie sur toutes les classes, et le Le message superclass
est un accesseur normal.
en tant que concept, un superclass
est le parent de la classe d'un objet. c'est-à-dire le niveau de classe un plus élevé dans la hiérarchie de classe que la classe de l'objet courant.
comme méthode nommée, elle renvoie le nom de la superclasse immédiate du récepteur.
par exemple, il est défini dans Squeak Smalltalk (et aussi dans ses dérivés, Pharo et Cuis) comme
superclass
"Answer the receiver's superclass, a Class."
^superclass
dans Dolphin Smalltalk, il est défini comme `superclasse "Une réponse qui est la récepteur immédiate superclasse (ou si aucune)."
^superclass'
mais-chaque classe dans la hiérarchie de classe est en fait une instance de sa classe mère. Donc la classe dont une classe donnée est une instance, est la métaclasse de la classe.
, par exemple aSortedCollection est un objet - une instance de la classe SortedCollection.
Sortedecollection est une classe nommée "Sortedecollection" dans la classe browsable hiérarchie. En même temps, c'est aussi une instance D'une métaclasse - une classe anonyme qui a une instance d'objet singleton, qui est une classe nommée. La classe nommée est visible dans la hiérarchie de classe, mais la métaclasse (être anonyme) est beaucoup moins visible. Il est là pour que Smalltalk
Smalltalk maintient une hiérarchie métaclasse, c'est-à-dire une hiérarchie des Classes des Classes. C'est beaucoup moins visible, car c'est un système anonyme. objets, mais vous pouvez trouver le niveau supérieur de la hiérarchie Metaclass dans le navigateur de classe. Les classes Class
et Metaclass
sont toutes deux des sous-classes de la classe Behaviour
, elle-même une sous-classe de la classe Object
.
une raison pour laquelle les gens disent que "dans Smalltalk, tout est un objet" est parce que la classe Object
est la racine de toutes les autres Classes et objets - il est au sommet de la hiérarchie des objets, qui contient la hiérarchie de Classe, et la Métaclasse hiérarchie.
(c'est généralement à ce stade que mon cerveau commence à saigner de mes oreilles, mais les 3 points suivants aident à repousser tout cela dans mon crâne)
si vous envoyez le message anInstanceOfAClass class
- vous obtiendrez
la classe de l'objet anintanceofaclass retourné.
si vous envoyez le message anInstanceOfAClass class superclass
- vous obtiendrez
le classe parent de la classe de l'objet anintanceofaclass retourné.
si vous envoyez le message anInstanceOfAClass class class
- vous obtiendrez
le Méta-verre singleton anonyme de la classe de l'objet anintanceofaclass retourné.