9
votes

SmallTalk Superclass vs métaclass?

i nouveau à OOP, mais avec un arrière-plan "procédural".

Je tente actuellement de me mettre la tête autour de OOP via GNU SmallTalk et de Lovejoy's "Smalltalk: Obtenir le message".

Je suis confus quant au diable La classe de métaclasse et de métaclass est, vs Superclass. Je peux voir le flux d'héritage de Superclass -> Classe -> Sous-classe; Mais je ne vois pas comment / où la métaclasse s'adapte. Tia ...


0 commentaires

4 Réponses :


7
votes

Il y a en fait deux niveaux d'héritage: héritage d'instance et héritage de classe.

SmallTalk dispose d'un schéma spécial qui permet de transmettre des classes comme objets. Cela signifie que classes sont également des objets dans leurs propres droits. La métaclasse est "simplement" la classe de l'objet de classe.

Il n'interfère pas avec l'héritage normal d'instance, il ne s'intègre donc nulle part dans la SuperClass -> Classe -> Sous-classe Schéma que vous avez utilisé.


3 commentaires

@ Zneak -> "La métaclasse est" simplement "la classe de l'objet de la classe". Je pensais que la superclasse était "la classe de l'objet de classe". C'est vraiment ma question - quel est le diff entre la superclasse et la métaclasse?


"Il y a en fait deux niveaux d'héritage: héritage d'instance et héritage de classe". De cette formulation, je suppose que vous êtes déroutant le héritage et l'instanciation ...


C'est vraiment ce que je voulais dire. Les sous-classes peuvent remplacer ce que nous appelions des méthodes statiques dans d'autres langues.



9
votes

Il y a une excellente description dans le livre en ligne gratuit Pharo par exemple , chapitre 13 (classes et métaclasses) . Les choses expliquées dans ce chapitre sont communes à toutes les implémentations SmallTalk.


2 commentaires

Merci pour le lien! Semble être ce que je cherche.


Vous devriez inclure le gist du livre qui répond à cette question au lieu de simplement faire référence à un lien. Une fois que ce lien est cassé, cette réponse ne devient plus utile



4
votes

Il y a deux différents relations dans la classe OO: instanciation et héritage . .

instanciation est la relation entre un objet et sa classe , le mot clé nouveau , etc., il est habituellement mis en œuvre par un pointeur dans le bas une représentation de nombril de tout objet. Dans SmallTalk, Classe AnoObject traverse ce pointeur; Il arrive également que des classes sont également des objets et des classes de classes sont appelées métaclasses, mais c'est la même relation que avec des instances.

héritage est une relation entre les classes . Vous pouvez passer d'une classe à sa superclasse en faisant alcuture superclass , et continuez de le faire jusqu'à ce que vous arriviez à la classe objet . Dans SmallTalk, le pointeur de Superclass n'est qu'une variable d'instance définie sur toutes les classes et le message Superclass est un accesseur normal.


0 commentaires

0
votes

comme concept, un Superclass est le parent de la classe d'un objet. C'est-à-dire le niveau de classe unique plus élevé dans la hiérarchie de la classe que la classe de l'objet actuel.

comme méthode nommée, il renvoie le nom de la superclasse immédiate du récepteur. par exemple. Il est défini dans Smalltalk (et aussi dans ses dérivés, Pharo et Cuis). Superclass "Répondre à la superclasse du récepteur, une classe." ^ Superclass

en dauphin smalltalk, il est défini comme `Superclass "Répondre à A qui est immédiat du récepteur Superclass (ou si aucun). " xxx

mais - chaque classe de la hiérarchie de la classe est en fait une instance de sa classe mère. Donc, la classe qu'une classe donnée est une instance de, est la métaclasse de la classe.

donc, par exemple ASORTEDCollection est un objet - une instance de la classe triéeCollection.

SoyedCollection est une classe nommée de catégorie "triée collection" dans la hiérarchie de classe navigable. Simultanément, il est aussi une instance d'une métaclass - une classe anonyme qui possède une instance d'objet Singleton, qui est une classe nommée. La classe nommée est visible dans la hiérarchie de la classe, mais la métaclasse (être anonyme) est beaucoup moins visible. Il est là pour que SmallTalk

SmallTalk maintient une hiérarchie de métaclasse, c'est-à-dire une hiérarchie des classes des classes. Il est beaucoup moins visible, car il est détenu sous forme d'objets système anonyme, mais vous pouvez trouver le niveau supérieur de la hiérarchie de la métaclasse dans le navigateur de classe. La classe classe et la classe métaclass se trouve sous forme de sous-sous-classes de classe comportement , elle-même une sous-classe de classe objet .

une raison pour laquelle les gens disent que "dans SmallTalk, tout est un objet" est parce que la classe objet est la racine de toutes les autres classes et objets - c'est au top très de la hiérarchie de l'objet, qui contient la hiérarchie de la classe et la hiérarchie de la métaclasse.

(C'est généralement à ce stade que mon cerveau commence à purger de mes oreilles, mais les 3 points suivants aident à la repasser jusqu'à mon crâne)

Si vous envoyez le Message aninstanceofaclass Classe - Vous serez
La classe de l'objet aninstance de laofaclass est retournée.

Si vous envoyez le message AninstanceClass Class Superclass - Vous obtiendrez
La classe parent de la classe de l'objet aninstance-revass est retournée.

Si vous envoyez le message aninstance de classe de classe - vous obtiendrez La métaclasse de Singleton anonyme de la classe de l'objet AninstanceDaclass est retournée.


0 commentaires