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?
Antwort
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".
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
Bedeutet das '@' ein Tupel? – Jim
@ 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). –
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.
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:
- Klasse Instanzvariablen
- 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!
- 1. Was ist das VB-Äquivalent von Javas instanceof und isInstance()?
- 2. Was bedeutet * in javas Hauptargelliste?
- 3. Was ist besser? private static vs privaten
- 4. Javas Calendar.DAY_OF_WEEK_IN_MONTH max Wert ist 6. Ist das korrekt?
- 5. Was ist die nächste Entsprechung zu Javas Character.isDefined in .NET?
- 6. Javas varargs Leistung
- 7. Javas getDate gibt das falsche Datum zurück
- 8. Javas Bigdecimal.divide und Rundung
- 9. Javas Eclipse kann das Konsolenprogramm nicht anzeigen
- 10. Was genau ist DEFAULT_COMPRESSION?
- 11. Was ist der Unterschied zwischen {% load staticfiles%} und {% load static%}
- 12. Sichere Verwendung von Javas SecureRandom
- 13. Was ist das Gegenteil von "ist"?
- 14. Was ist die C# Äquivalent public static final in Java
- 15. Äquivalent von Javas Matcher.lookingAt() in Objective C
- 16. C++ entspricht Javas System.arraycopy
- 17. ‚Static‘ ist kein gültiger Tag-Bibliothek: Template-Bibliothek Static nicht
- 18. Javas Darstellung serialisierter Objekte
- 19. Deep Copy Duplicate() von Javas ByteBuffer
- 20. Javas Scanner vs String.split() vs StringTokenizer; Was sollte ich verwenden?
- 21. Nebeneffekt - was ist das?
- 22. Reflect.js, Was ist das?
- 23. Javas instanceof ungerades Verhalten
- 24. Was ist das? Art?
- 25. Hat Clojure ein Äquivalent von Javas Importpaket? *?
- 26. Javas Checkstyle, MagicNumberCheck
- 27. Testen von AbstractProcessor (Javas Annotationshandling zur Kompilierzeit)
- 28. Was ist 'das' ist Javascript
- 29. static :: staticFunctionName()
- 30. Was bedeutet "{x: Static}" in XAML?
Nicht einer "formellen" Antwort würdig, aber ich stolperte über diese Seite, die Ihnen helfen könnte: http://per.bothner.com/papers/smalltalk.html. –
Ich würde vorschlagen, Ihre zweite Frage in eine _separate_ Frage auszubreiten. –
@Frank: Fein. Wie du sagst. – Jim