Die s Die Antwort ist, dass Sie in Smalltalk ziemlich genau dasselbe tun können. Von dem anrufenden Code würde es wie folgt aussehen:
aColor := Color named: 'Red'.
Die lange Antwort ist, dass in Smalltalk Sie nicht Bauer haben, zumindest nicht in dem Sinne, dass Sie eine Sondermeldung nach der Klasse benannt haben. Was Sie in Smalltalk tun, ist die Definition von Nachrichten auf Klassenebene (d. H. Nachrichten, die von der Klasse verstanden werden, nicht die Instanz [*]), in denen Sie Ihre Instanzen instanziieren und konfigurieren können.
(class) Color>>named: aName
| color |
color := self new.
color name: aName.
^color.
zu beachten Einige Dinge: Unter der Annahme, dass Ihre Color
Klasse hat eine name
Instanzvariable und einen Setter für sie, die #named:
Verfahren würde wie implementiert werden
- Wir sind mit dem
#new
Nachricht gesendet die Klasse zum Erstellen einer neuen Instanz. Sie können sich die Nachricht #new
als primitiven Weg zum Erstellen von Objekten vorstellen (Hinweis: Sie können die Implementoren der #new
Nachricht durchsuchen, um zu sehen, wie sie implementiert wird).
- Wir können so viele Klassenmethoden definieren, wie wir neue "konfigurierte" Instanzen (z. B.
Color fromHexa:
) erstellen oder vorerstellte Instanzen zurückgeben möchten (z. B. Color blue
). Sie können immer noch eine nicht initialisierte Instanz erstellen, indem Sie Color new
tun. Wenn Sie dieses Verhalten verbieten möchten, müssen Sie die Klassenmeldung #new
überschreiben.
Es gibt viele gute Bücher, die Sie über Smalltalk Grundlagen bei Stef's Free Online Smalltalk Books
[*] Das ist ganz natürlich aufgrund der orthogonalen Natur auf Smalltalk, da alles (einschließlich Klassen) ist ein Objekt lesen kann. Wenn Sie interessiert sind, überprüfen Sie Kapitel 13 von Pharo by Example oder einen anderen Verweis auf Klassen und Metaklassen in Smalltalk.
HTH
Noch besser ist keinen Setter und mit einer einzigen Initialisierungsmethode parametrisiert nach Bedarf: 'Farbe >> #initializeWithName:' in diesem Fall. –
Um ein wenig zu verdeutlichen, ist die Klasse ein Objekt, die Instanz ist ein anderes Objekt. Um die Kapselung zu respektieren, hat die Klasse keinen Zugriff auf Instanzvariablen der Instanz - außer, indem sie durch Senden einer Nachricht bittet. Es ist ziemlich einheitlich, Smalltalk ist zum Senden von Nachrichten, sogar für solche grundlegenden Kernel-Aufgaben ... Wie FrankShearar sagte, könnte es besser sein, eine einzige Nachricht auf der Instanzseite zu haben, die alle Variablen auf einmal setzt, es liegt an den Programmierern zu urteilen. –
FrankShearar & aka.nice, danke für die Verbesserung der Antwort –