2010-06-23 4 views
10

Was ist das Smalltalk-Äquivalent der statischen Felder und Methoden von Java? IOW, was machen die Smalltalkers, wenn sie Daten und/oder Methoden auf Klassenebene benötigen?Was ist das Smalltalk-Äquivalent von Javas Static?

+0

Nicht einer "formellen" Antwort würdig, aber ich stolperte über diese Seite, die Ihnen helfen könnte: http://per.bothner.com/papers/smalltalk.html. –

+0

Ich würde vorschlagen, Ihre zweite Frage in eine _separate_ Frage auszubreiten. –

+0

@Frank: Fein. Wie du sagst. – Jim

Antwort

10

Wir verwenden klassenseitige Methoden/Instanzvariablen. Eine Klasse ist schließlich ein Objekt und kann Methoden haben.

Zum Beispiel hat die Rechteck-Klasse eine Methode #origin: Ecke: so kann man schreiben

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

ein Rechteck zu erstellen. Dies ist nur die Nachricht #origin: corner: an das Objekt namens Rectangle (eine Klasse ist ein Objekt!) Mit den beiden Points als Parameter gesendet.

Klassenseitige Instanzvariablen funktionieren auf die gleiche Weise. Eine Klasse, die ein Objekt ist, kann Instanzvariablen haben. Von der SUnit Bibliothek:

TestCase class 
    instanceVariableNames: 'history' 

und dann Testcase-Klasse stellt diese in üblicher Weise mit einem Getter/Setter (#Geschichte und #Geschichte :).

EDIT: Die @, die ich verwendet habe, hat ein gutes Stück der Diskussion verursacht. Es ist eine sogenannte binary message, die es ermöglicht, Selektoren zu definieren, die genau aussehen, was andere Sprachen Infix-Operatoren nennen würden. Zum Beispiel 3 + 4 oder [email protected]. Im Fall @ definiert die Klasse Number eine Methode namens @, die einen Parameter y, definiert als ^Point x: self y: y - "gibt einen Punkt, dessen x-Koordinate ist mein eigener Wert und dessen y-Koordinate ist der Parameter".

Punkt ist ein geordnetes Paar, aber natürlich gibt es nichts, was einen daran hindert, höherdimensionale Versionen zu definieren. Point könnte eine Methode namens @ definieren, die so aussah, zum Beispiel: ^Triple x: self x y: self y z: z - "gebe einen Punkt in R^3 zurück, dessen x, y Koordinaten meine eigenen sind, und dessen z Koordinate der gegebene Parameter ist".

+0

Verwenden andere Sprachen als Smalltalk @ zum Abgrenzen der verschiedenen Koordinaten eines Punktes? Ich glaube nicht, dass ich diese spezifische Syntax schon einmal gesehen habe. – JAB

+0

Bedeutet das '@' ein Tupel? – Jim

+0

@ ist eine "binäre Nachricht" - eine Nachricht, die einen einzigen Parameter benötigt, aber nicht die üblichen folgenden:. Number definiert eine Methode namens @, die einen Point zurückgibt:^Point x: self y: y (offensichtlich ist y der einzige Parameter). –

1

In den meisten Smalltalk-Typen haben Sie Klassenvariablen. Typischerweise werden Klassenvariablen für z.B. singletons. Es gibt jedoch Unterschiede in den Variablentypen, die Sie zwischen Smalltalk-Varianten verwenden können. Lesen Sie daher die Dokumentation zu diesem Punkt für Ihre spezielle Implementierung.

4

Die wichtigste Denkrichtung, die benötigt wird, wenn Sie von Java oder Smalltalk zu Smalltalk kommen, ist, dass Klassen Objekte sind.

Ein Statik in Java-ähnlichen Sprachen kann viele verschiedene Semantiken haben. Normalerweise hat das etwas mit Sichtbarkeit zu tun. Sie benötigen ein Objekt, das von allen Instanzen einer Klasse unabhängig ist, aber Sie möchten die Sichtbarkeit dieses Objekts innerhalb der Klasse einschränken, dh nur von Instanzen der Klasse oder der Klasse selbst (in Smalltalk, weil in Java) Klassen sind keine erstklassigen Objekte).

In Smalltalk haben Sie in der Regel mehr Möglichkeiten:

  1. Klasse Instanzvariablen
  2. Klassenvariablen oder Poolgrößen (abhängig von Ihrem Smalltalk Dialekt)

Eine Klasse Instanzvariable in der Tat ist genau wie eine Instanzvariable von Instanzen jeder Klasse: Die Klasse hat diese Eigenschaft, und diese kann für jede Instanz der Klasse zugänglich gemacht werden, indem eine Getter-Methode für die Klasse bereitgestellt wird (nicht für die Instanzen, wir nennen dies eine Klassenmethode). . Dies ist nützlich, wenn Sie Standardwerte und dergleichen haben. Beispiel:

Definieren Sie eine Klasse Car, mit Instanzvariable colour, PLUS eine Klasse Instanzvariable defaultColour (was natürlich würde den Wert „BLACK“ haben ;-))

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

Dies ist eine Klassendefinition (tatsächlich eine Nachricht an das Objekt Smalltalk) in VisualWorks Smalltalk. Wenn Sie eine Unterklasse von Car erstellen, erbt sie die Klasseninstanzvariable defaultColour, wie ein normales Objekt auch. Wenn die Klasseninstanzvariable defaultColour einen Wert hat, erbt die Unterklasse auch diesen Wert!

Verwandte Themen