Smalltalk Super vs metaclass?
-
22-09-2019 - |
Frage
ich neu in OOP, aber mit einem "prozedurale" Hintergrund.
Ich versuche zur Zeit, meinen Kopf um OOP über GNU Smalltalk und Lovejoys „Smalltalk: Die Botschaft“ zu erhalten.
Ich bin in Bezug auf die das Heck verwirrt die Metaklasse und Metaclass Klasse sind, vs geordneten Klasse. Ich kann das Erbe Fluss Super siehe -> Klasse -> Unterklasse; aber ich sehe nicht, wie / wo metaclass paßt. TIA ...
Lösung
Es gibt eine ausgezeichnete Beschreibung in dem freien Online-Buch Pharo von Beispiel , Kapitel 13 (Klassen und metaclasses) . Die Dinge, erklärt in diesem Kapitel sind für alle Smalltalk-Implementierungen.
Andere Tipps
Es gibt zwei Ebenen der Vererbung. B. Vererbung und Klassenvererbung
Smalltalk hat eine Sonderregelung, die es möglich passieren um Klassen als Objekte macht. Das bedeutet Klassen sind auch Objekte in ihren eigenen Rechten. Die Metaklasse ist „einfach“ die Klasse des Klassenobjekts.
Es stört nicht mit normaler Instanz Vererbung, so paßt es nicht überall in dem superclass -> class -> subclass
Diagramm Sie verwendet hat.
Es gibt zwei unterschiedliche Beziehungen in klassenbasierten OO. Instanziierung und Erbe
Instanziierung ist die Beziehung zwischen einem Objekt und seiner Klasse , die new
Schlüsselwort, etc. In der Regel durch einen Zeiger in der Low-Level-Darstellung eines Objekts implementiert es. In Smalltalk, quert anObject class
diesen Zeiger; es kommt auch vor, dass Klassen werden auch Objekte und Klassen von Klassen metaclasses genannt werden, aber dies ist das gleiche Verhältnis wie bei Instanzen.
Vererbung ist eine Beziehung zwischen den Klassen . Sie können aus einer Klasse zu seiner übergeordneten Klasse gehen von aClass superclass
tun, und halten Sie dabei, bis Sie auf die Klasse Object
bekommen. In Smalltalk ist die Super Zeiger nur eine Instanz-Variable auf alle Klassen definiert, und die superclass
Nachricht ist eine normale Accessor.
Als Konzept ein superclass
ist die Mutter eines Klasse des Objekts. das heißt, die Klasse einer Ebene höher in der Klassenhierarchie ist als die Klasse des aktuellen Objekts.
Als benannte Methode, gibt er den Namen der unmittelbaren Oberklasse des Empfängers.
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 ist definiert als `Super „Antwort ein, die der Empfänger der unmittelbaren Super (oder wenn keine). "
^superclass'
Aber - jede Klasse in der Klassenhierarchie ist eigentlich eine Instanz seiner Elternklasse. So ist die Klasse, dass eine gegebene Klasse ist eine Instanz, die MetaClass der Klasse.
So, zum Beispiel aSortedCollection ist ein Ziel -. eine Instanz der Klasse SortedCollection
SortedCollection ist ein Klasse - namens Class 'SortedCollection' in der durchsuchbaren Klassenhierarchie. Gleichzeitig ist es auch eine Instanz einer Metaklasse - eine anonyme Klasse, die eine Singleton-Objekt-Instanz hat, die eine benannte Klasse ist. Die genannte Klasse ist sichtbar in der Klassenhierarchie, aber die Metaklasse (wobei anonym) ist viel weniger sichtbar. Es ist dort, so dass Smalltalk
Smalltalk hält eine Metaklasse Hierarchie, das heißt eine Hierarchie von der Klasse der Klassen. Es ist viel weniger sichtbar, da sie als anonyme Systemobjekte gehalten ist, aber man kann die oberste Ebene der Metaclass Hierarchie im Klassenbrowser finden. Sowohl die Klasse Class
und die Klasse Metaclass
sind als Unterunterklassen der Klasse Behaviour
, selbst eine Unterklasse der Klasse Object
gefunden werden.
Ein Grund dafür, dass die Leute sagen, dass „In Smalltalk, alles ist ein Objekt“ ist, weil die Klasse Object
ist die Wurzel aller anderen Klassen und Objekte - es an der sehr Spitze der Objekthierarchie, die die Klassenhierarchie enthält, und die Metaklasse Hierarchie.
(Es ist im Allgemeinen in diesem Stadium, dass mein Gehirn zu bluten aus meinen Ohren beginnt, aber th folgende drei Punkte helfen Push alles zurück in meinen Schädel)
Wenn Sie die Nachricht anInstanceOfAClass class
senden - Sie erhalten
die Klasse des Objekts anInstanceOfAClass zurückgegeben.
Wenn Sie die Nachricht anInstanceOfAClass class superclass
senden - Sie erhalten
die Elternklasse der Klasse des Objekts anInstanceOfAClass zurückgegeben.
Wenn Sie die Nachricht anInstanceOfAClass class class
senden - Sie erhalten
die anonyme Singleton Metaclass der Klasse des Objekts anInstanceOfAClass zurückgegeben.