2013-01-08 9 views
8

In linguaggi come Java e C++ diamo i parametri ai costruttori.Variabili di inizializzazione smalltalk

Come si fa a Pharo Smalltalk?

voglio qualcosa di simile

|aColor| 
aColor = Color new 'red'. 

O si tratta di una cattiva pratica e devo sempre fare

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

risposta

12

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

+1

Ancora meglio è non avere alcuna incastonatori e un unico metodo di inizializzazione parametrizzate come necessario: 'colore >> #initializeWithName:' ​​in questo caso. –

+1

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

+0

FrankShearar e aka.nice, grazie per migliorare la risposta –

3

In Smalltalk tutti i campi membri sono strettamente private e di assegnare ad essi dovrete definire i metodi di assegnazione.

Color >> name: aString 
    name := aString 

Allora si potrebbe creare l'oggetto in questo modo:

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

Comunemente per ridurre il metodo verbosità fabbrica è utilizzato:

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

Con questo si potrebbe creare nuovi oggetti come questo:

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