2013-01-08 20 views
8

In Sprachen wie Java und C++ geben wir Konstruktoren Parameter.Smalltalk Initialisierung Variablen

Wie machst du das in Pharo Smalltalk?

Ich möchte so etwas wie

|aColor| 
aColor = Color new 'red'. 

Oder diese schlechte Praxis und sollte ich tun, immer

|aColor| 
aColor = Color new. 
aColor name:= red.d 

Antwort

12

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

+1

Noch besser ist keinen Setter und mit einer einzigen Initialisierungsmethode parametrisiert nach Bedarf: 'Farbe >> #initializeWithName:' ​​in diesem Fall. –

+1

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. –

+0

FrankShearar & aka.nice, danke für die Verbesserung der Antwort –

3

In Smalltalk alle Mitgliedsfelder streng privat sind und ihnen zuweisen Sie haben Definieren Sie Zuweisungsmethoden.

Color >> name: aString 
    name := aString 

Dann könnten Sie Ihr Objekt wie folgt erstellen:

|aColor| 
aColor := (Color new) 
    name: 'red'; 
    yourself. 

Häufig Ausführlichkeit Factory-Methode zu reduzieren verwendet:

Color class >> withName: aName 
^(self new) 
    name: aName; 
    yourself. 

Damit Sie neue Objekte wie diese schaffen könnte:

|aColor| 
aColor := Color withName: 'red'.