s la risposta hort è che puoi fare praticamente lo stesso in Smalltalk. Dal codice chiamante sarebbe assomigliare:
aColor := Color named: 'Red'.
La risposta lunga è che in Smalltalk non devi costruttori, almeno non nel senso che si ha un messaggio speciale che prende il nome della classe. Quello che fai in Smalltalk è la definizione di messaggi di classe (cioè i messaggi compresi dalla classe, non l'istanza [*]) in cui puoi creare un'istanza e configurare le tue istanze. Supponendo che la classe Color
ha una variabile name
istanza e un setter per essa, il metodo #named:
sarebbe stato attuato come:
(class) Color>>named: aName
| color |
color := self new.
color name: aName.
^color.
Alcune cose da notare:
- Stiamo usando il messaggio
#new
inviato a la classe per creare una nuova istanza. Puoi pensare al messaggio #new
come al modo primitivo per la creazione di oggetti (suggerimento: puoi consultare gli implementatori del messaggio #new
per vedere come è implementato).
- Possiamo definire tutti i metodi di classe che vogliamo creare nuove istanze "configurate" (ad esempio
Color fromHexa:
) o restituire quelli pre-creati (ad esempio Color blue
).
- È ancora possibile creare un'istanza non inizializzata eseguendo
Color new
. Se si desidera impedire tale comportamento, è necessario ignorare il messaggio della classe #new
.
Ci sono molti buoni libri che si possono leggere su basi Smalltalk a Stef's Free Online Smalltalk Books
[*] Questo è abbastanza naturale a causa della natura ortogonale su Smalltalk, dal momento che tutto (classi comprese) è un oggetto. Se sei interessato, consulta il Capitolo 13 di Pharo by Example o qualsiasi altro riferimento a classi e metaclassi in Smalltalk.
HTH
fonte
2013-01-08 22:14:00
Ancora meglio è non avere alcuna incastonatori e un unico metodo di inizializzazione parametrizzate come necessario: 'colore >> #initializeWithName:' in questo caso. –
Per chiarire un po ', la classe è un oggetto, l'istanza è un altro oggetto. Per rispettare l'incapsulamento, la classe non ha accesso alle variabili di istanza dell'istanza, tranne che chiede gentilmente di inviare il messaggio. È abbastanza uniforme, Smalltalk riguarda l'invio di messaggi, anche per compiti basilari del kernel ... Come ha detto FrankShearar, potrebbe essere meglio avere un singolo messaggio sul lato istanza che imposta tutte le variabili contemporaneamente, è compito dei programmatori giudicare. –
FrankShearar e aka.nice, grazie per migliorare la risposta –