Die Programmiersprache Ruby (German Edition)
werden. Außerhalb der Definition müssen sie natürlich mit dem Namen der Klasse beginnen:
Point::UNIT_X + Point::UNIT_Y # => (1,1)
Beachten Sie, dass wir die Konstanten erst definieren können, nachdem wir die Methode
initialize
definiert haben, da sie sich in diesem Beispiel auf Instanzen der Klasse beziehen. Denken Sie auch daran, dass es durchaus erlaubt ist, Konstanten der Klasse
Point
außerhalb der Klasse zu definieren:
Point::NEGATIVE_UNIT_X = Point.new(-1,0)
7.1.15 Klassenvariablen
Klassenvariablen sind für die Klassenmethoden und die Instanzmethoden einer Klassen sichtbar und werden von ihnen gemeinsam genutzt. Auch in der Klassendefinition selbst lassen sie sich verwenden. Wie Instanzvariablen sind Klassenvariablen gekapselt – sie können von der Implementierung einer Klasse genutzt werden, sind aber für Anwender einer Klasse nicht sichtbar. Klassenvariablen haben Namen, die mit
@@
beginnen.
Es gibt keinen wirklichen Grund, in unserer
Point
-Klasse Klassenvariablen zu verwenden, aber für dieses Tutorium wollen wir annehmen, dass wir Daten über die Anzahl der erzeugten
Point
-Objekte und ihre Koordinatenmittelwerte sammeln wollen. So könnte der Code aussehen:
class Point
# Initialisiere unsere Klassenvariablen in der Klassendefinition selbst
@@n = 0 # Wie viele Punkte wurden erstellt?
@@totalX = 0 # Summe aller x-Koordinaten
@@totalY = 0 # Summe aller y-Koordinaten
def initialize(x,y) # Initialize-Methode
@x,@y = x, y # Setzt initiale Werte für Instanzvariablen
# Verwende die Klassenvariablen in dieser Instanzmethode, um die Daten zu
# sammeln
@@n += 1 # Zähle, wie viele Punkte erzeugt wurden
@@totalX += x # Diese Koordinaten den Summen hinzufügen
@@totalY += y
end
# Klassenmethode, um die gesammelten Daten auszugeben
def self.report
# Verwenden der Klassenvariablen in einer Klassenmethode
puts "Anzahl der erzeugten Punkte: #@@n"
puts "Mittelwert x-Koordinate: #{@@totalX.to_f/@@n}"
puts "Mittelwert y-Koordinate: #{@@totalY.to_f/@@n}"
end
end
Bemerkenswert an diesem Code ist, dass Klassenvariablen in Instanzmethoden, Klassenmethoden und der Klassendefinition selber (außerhalb jeglicher Methode) verwendet werden. Klassenvariablen unterscheiden sich grundlegend von Instanzvariablen. Wir haben gesehen, dass Instanzvariablen immer im Hinblick auf
self
ausgewertet werden. Das ist der Grund dafür, dass sich eine Referenz einer Instanzvariablen in einer Klassendefinition oder Klassenmethode vollständig von einer Referenz einer Instanzvariablen in einer Instanzmethode unterscheidet. Klassenvariablen werden andererseits immer im Bezug auf das Klassenobjekt ausgewertet, das von der umschließenden
class
-Definitionsanweisung erzeugt wurde.
7.1.16 Klassen-Instanzvariablen
Klassen sind Objekte und können wie alle anderen Objekte auch Instanzvariablen besitzen. Die Instanzvariable einer Klasse — häufig als Klassen-Instanzvariable bezeichnet – sind nicht das Gleiche wie Klassenvariablen. Aber sie sind ähnlich genug, um sie oft anstelle von Klassenvariablen verwenden zu können.
Eine Instanzvariable, die innerhalb einer
class
-Definition, aber außerhalb einer Instanzmethodendefinition definiert wird, ist eine Klassen-Instanzvariable. Wie Klassenvariablen sind Klassen-Instanzvariablen mit der Klasse selbst und nicht mit einer bestimmten Instanz der Klasse verbunden. Ein Nachteil von Klassen-Instanzvariablen ist, dass sie nicht innerhalb von Instanzmethoden verwendet werden können, wie es bei Klassenvariablen der Fall ist. Ein weiterer Nachteil ist die mögliche Verwechslung mit normalen Instanzvariablen. Ohne die eindeutigen Präfixe der Klassenvariablen kann es schwieriger sein, sich zu merken, ob eine Variable mit den Instanzen oder einem Klassenobjekt selber verbunden ist.
Einer der größten Vorteile einer Klassen-Instanzvariablen gegenüber Klassenvariablen hat mit dem verwirrenden Verwalten von Klassenvariablen zu tun, wenn es um das Bilden von Subklassen zu einer bestehenden Klasse geht. Wir werden auf diesen Punkt später noch zurückkommen.
Lassen Sie uns unsere Statistikversion der
Point
-Klasse anpassen, um darin Klassen-Instanzvariablen statt Klassenvariablen zu nutzen. Die einzige Schwierigkeit ist, dass wir den Code zum Aktualisieren der Statistik aus der Methode
initialize
(einer Instanzmethode) in die Klassenmethode
new
verlagern müssen, um Punkte zu erzeugen, weil Klassen-Instanzvariablen nicht innerhalb von Instanzmethoden genutzt werden können:
class
Weitere Kostenlose Bücher