2010-01-25 13 views
5

Ich neu in OOP, aber mit einem "prozeduralen" Hintergrund.Smalltalk Superklasse vs Metaklasse?

Ich versuche gerade, mich mit OOP über GNU Smalltalk und Lovejoy's "Smalltalk: Getting The Message" zu beschäftigen.

Ich bin verwirrt, was die Metaklasse und Metaklasse-Klasse sind, vs Superklasse. Ich kann den Vererbungsfluss der Oberklasse sehen -> class -> subclass; aber ich sehe nicht, wie/wo Metaklasse passt. TIA ...

Antwort

5

Es gibt eine ausgezeichnete Beschreibung im kostenlosen Online-Buch Pharo by Example, Kapitel 13 (Klassen und Metaklassen). Die in diesem Kapitel erläuterten Dinge gelten für alle Smalltalk-Implementierungen.

+0

Danke für den Link! Scheint zu sein, wonach ich suche. – duke

+1

Sie sollten den Kern des Buches, das diese Frage beantwortet, anstatt nur auf einen Link verweisen. Sobald diese Verbindung unterbrochen ist, wird diese Antwort nicht länger nützlich –

4

Es gibt tatsächlich zwei Ebenen der Vererbung: Instanzvererbung und Klassenvererbung.

Smalltalk hat ein spezielles Schema, das es ermöglicht, Klassen als Objekte zu übergeben. Das bedeutet Klassen sind auch Objekte in ihren eigenen Rechten. Die Metaklasse ist "einfach" die Klasse des Klassenobjekts.

Es stört die normale Instanzvererbung nicht, daher passt es nicht in das von Ihnen verwendete superclass -> class -> subclass Diagramm.

+0

@ zneak -> "Die Metaklasse ist" einfach "die Klasse des Klassenobjekts." Ich dachte, dass die Oberklasse "die Klasse des Klassenobjekts" war. Das ist meine Frage wirklich - was ist der Unterschied zwischen Superklasse und Metaklasse? – duke

+0

"Es gibt zwei Vererbungsebenen: Instanzvererbung und Klassenvererbung." Aus dieser Formulierung, ich würde vermuten, dass Sie Vererbung und Instanziierung verwirren ... –

+0

Das ist wirklich was ich meinte. Unterklassen können überschreiben, was wir in anderen Sprachen als statische Methoden bezeichnen würden. – zneak

3

Es gibt zwei verschiedene Beziehungen in klassenbasierten OO: Instanziierung und Erbe.

Instanziierung ist die Beziehung zwischen einem Objekt und seiner Klasse, die new Schlüsselwort usw. üblicherweise durch einen Zeiger in der Low-Level-Darstellung jedes Objekts implementiert es. In Smalltalk durchläuft anObject class diesen Zeiger; Es kommt auch vor, dass Klassen auch Objekte sind, und Klassen von Klassen werden Metaklassen genannt, aber dies ist die gleiche Beziehung wie bei Instanzen.

Vererbung ist eine Beziehung zwischen Klassen. Sie können von einer Klasse zu ihrer Oberklasse gehen, indem Sie aClass superclass tun, und tun Sie dies, bis Sie zur Klasse Object gelangen. In Smalltalk ist der Superklassenzeiger nur eine Instanzvariable, die für alle Klassen definiert ist, und die Nachricht ist ein normaler Accessor.

0

Als ein Konzept ist ein das übergeordnete Element der Klasse eines Objekts. d.h. die Klasse eine Ebene höher in der Klassenhierarchie als die Klasse des aktuellen Objekts.

Als benannte Methode gibt sie den Namen der unmittelbaren Oberklasse des Empfängers zurück. z.B. es definedin Squeak Smalltalk (und auch in seinen Derivaten, Pharo und Cuis) als superclass "Answer the receiver's superclass, a Class." ^superclass

In Dolphin Smalltalk, es definiert ist, als `Super "eine Antwort, die der unmittelbaren geordneten Klasse des Empfängers ist (oder wenn keine)."

^superclass' 

Aber - jede Klasse in der Klassenhierarchie ist eigentlich eine Instanz ihrer Elternklasse. Die Klasse, zu der eine bestimmte Klasse gehört, ist also die MetaClass der Klasse.

Also z.B. aSortedCollection ist ein Objekt - eine Instanz der Klasse SortedCollection.

SortedCollection ist eine Klasse namens 'SortedCollection' in der durchsuchbaren Klassenhierarchie. Gleichzeitig ist es auch eine Instanz einer Metaklasse - eine anonyme Klasse, die eine Singleton-Objektinstanz hat, die eine benannte Klasse ist. Die benannte Klasse ist in der Klassenhierarchie sichtbar, aber die Metaklasse (anonym) ist viel weniger sichtbar. Es ist dort, so dass Smalltalk

Smalltalk eine Metaklassenhierarchie unterhält, d. H. Eine Hierarchie der Klassen der Klassen. Es ist viel weniger sichtbar, da es als anonyme Systemobjekte gehalten wird, aber Sie können die oberste Ebene der Metaklassenhierarchie im Klassenbrowser finden. Sowohl die Klasse Class als auch die Klasse Metaclass befinden sich als Unterklassen der Klasse Behaviour, die ihrerseits eine Unterklasse der Klasse Object ist.

Ein Grund, warum Leute sagen, dass "In Smalltalk alles ein Objekt ist" ist, weil Klasse Object die Wurzel aller anderen Klassen und Objekte ist - es ist ganz oben in der Objekthierarchie, die die Klassenhierarchie enthält und die Metaklassenhierarchie.

(es ist im Allgemeinen in diesem Stadium, dass mein Gehirn aus meinen Ohren zu bluten beginnt, aber th folgenden drei Punkte helfen, um alles wieder in meinen Schädel schieben)

Wenn Sie die Nachricht senden anInstanceOfAClass class - Sie werden get
die Klasse des Objekts anInstanceOfAClass zurückgegeben.

Wenn Sie senden die Nachricht anInstanceOfAClass class superclass - Sie
der Elternklasse der Klasse des Objekts erhalten werden anInstanceOfAClass zurückgegeben.

Wenn Sie die Nachricht senden anInstanceOfAClass class class - erhalten Sie die anonyme Singleton Metaclass der Klasse des Objekts anInstanceOfAClass zurückgegeben.