2010-06-23 1 views
10

Qual è l'equivalente Smalltalk dei campi e dei metodi statici di Java? IOW, cosa fanno gli Smalltalker quando hanno bisogno di dati e/o metodi a livello di classe?Qual è l'equivalente Smalltalk di Java statico?

+0

Non degno di una risposta "formale", ma mi sono imbattuto in questa pagina che potrebbe aiutarti: http://per.bothner.com/papers/smalltalk.html. –

+0

Suggerirei di inserire la tua seconda domanda in una domanda separata. –

+0

@Frank: bene. Come dici. – Jim

risposta

10

Utilizziamo metodi di classe/variabili di istanza. Una classe è un oggetto, dopotutto, quindi può avere metodi.

Per esempio, la classe rettangolo ha un metodo #origin: angolo: così si può scrivere

Rectangle origin: [email protected] corner: [email protected] 

per creare un rettangolo. Questo è solo il messaggio #origin: corner: inviato all'oggetto chiamato Rectangle (una classe è un oggetto!) Con i due punti come parametri.

Le variabili di istanza di classe funzionano allo stesso modo. Una classe, essendo un oggetto, può avere variabili di istanza. Dalla biblioteca Sunit:

TestCase class 
    instanceVariableNames: 'history' 

e quindi classe TestCase espone questa nel solito modo, con un getter/setter (#history e :) #history.

MODIFICA: Il numero @ utilizzato ha causato un bel po 'di discussione. È ciò che si chiama binary message, che consente di definire selettori che sembrano proprio ciò che altri linguaggi chiamerebbero operatori di infissi. Ad esempio, 3 + 4 o [email protected]. Nel caso di @, la classe Number definisce un metodo chiamato @ prendendo un parametro , definito come ^Point x: self y: y - "restituisce un Punto la cui coordinata x è il mio valore e la cui coordinata y è il parametro".

Point è una coppia ordinata, ma ovviamente non c'è nulla che impedisca di definire versioni di dimensioni superiori. Point potrebbe definire un metodo chiamato @ simile a questo, ad esempio: ^Triple x: self x y: self y z: z - "restituisce un punto in R^3 le cui coordinate x, y sono le mie e la cui coordinata z è il parametro specificato".

+0

Qualsiasi lingua diversa da Smalltalk usa @ per delimitare le diverse coordinate di un punto? Non credo di aver mai visto quella specifica sintassi prima. – JAB

+0

Questo '@' indica una tupla? – Jim

+0

@ è un "messaggio binario" - un messaggio che accetta un singolo parametro, ma non ha bisogno del solito trascinamento:. Number definisce un metodo chiamato @ che restituisce un punto:^Punto x: self y: y (dove y è l'unico parametro, ovviamente). –

1

Nella maggior parte dei tipi di Smalltalk sono presenti variabili di classe. In genere, le variabili di classe vengono utilizzate per es. singletons. Esistono tuttavia differenze nei tipi di variabili che è possibile utilizzare tra i sapori di Smalltalk, quindi leggi la documentazione su questo punto per la tua particolare implementazione.

4

Il cambiamento mentale più importante necessario se si arriva a Smalltalk da Java o simili, è che le classi sono oggetti.

Un linguaggio statico in linguaggio Java può avere molte semantiche diverse. Di solito questo ha a che fare con la visibilità. È necessario un oggetto indipendente da qualsiasi istanza di una classe, ma si desidera limitare la visibilità di questo oggetto all'interno della classe, ovvero: solo visibile dalle istanze della classe o della classe stessa (in Smalltalk, perché in Java le classi non sono oggetti di prima classe).

In Smalltalk di solito si hanno più opzioni per questo:

  1. variabili di istanza di classe
  2. variabili di classe o variabili della piscina (a seconda del dialetto Smalltalk)

Una variabile di istanza di classe è davvero proprio come una variabile di istanza di istanze di qualsiasi classe: la classe ha questa proprietà e questa può essere resa accessibile per qualsiasi istanza della classe fornendo un metodo getter sulla classe (non sulle istanze, chiamiamo questo metodo di classe) . Questo è utile se hai valori predefiniti e così via. Esempio:

Definire una classe Car, con esempio variabile colour, PLUS un'istanza di classe variabile defaultColour (che ovviamente avrebbe il valore "BLACK" ;-))

Smalltalk defineClass: #Car 
    superclass: #{Core.Object} 
    indexedType: #none 
    private: false 
    instanceVariableNames: 'colour ' 
    classInstanceVariableNames: 'defaultColour' 
    imports: '' 
    category: '' 

Questa è una definizione di classe (in realtà un messaggio all'oggetto Smalltalk) in VisualWorks Smalltalk. Se si crea una sottoclasse di Car, essa eredita la variabile di istanza di classe defaultColour, come farebbe anche un oggetto normale. Se la variabile di istanza della classe defaultColour ha un valore, la sottoclasse eredita anche questo valore!