Die Programmiersprache Ruby (German Edition)
aktuellen Klasse. (Beachten Sie, dass die Superklasse die Methode nicht selbst definieren muss – sie kann sie von einem ihrer Vorfahren erben.) Sie können für
super
Argumente wie für eine normale Methode angeben. Häufig wird die Methodenverkettung in der Methode
initialize
einer Klasse genutzt. So könnte die Methode
initialize
für unsere Klasse
Point3D
aussehen:
class Point3D < Point
def initialize(x,y,z)
# Übergib die ersten beiden Argumente an die initialize-Methode der Superklasse
super(x,y)
# Das dritte Argument selber behandeln
@z = z;
end
end
Wenn Sie
super
einfach so als Schlüsselwort nutzen — ohne Argumente und Klammern – werden alle Argumente, die die aktuelle Methode erhalten hat, an die Methode der Superklasse weitergegeben. Beachten Sie allerdings, dass es sich dabei um die aktuellen Werte der Methodenparameter handelt. Wenn die aktuelle Methode die Werte ihrer Parametervariablen verändert hat, werden diese veränderten Werte an die Superklassenmethode weitergegeben.
Wie beim Aufruf normaler Methoden sind die Klammern um die Argumente von
super
optional. Da ein »leeres«
super
allerdings eine besondere Bedeutung besitzt, müssen Sie explizit ein Paar leerer Klammern nutzen, wenn Sie keine Argumente an eine Superklassenmethode übergeben wollen, obwohl die aktuelle Methode welche besitzt.
7.3.4 Vererbung von Klassenmethoden
Klassenmethoden können genauso wie Instanzmethoden vererbt und überschrieben werden. Wenn unsere Klasse
Point
eine Klassenmethode
sum
definiert, erbt auch unsere Subklasse
Point3D
diese Methode. Das bedeutet, dass der Ausdruck
Point3D.sum
dieselbe Methode aufruft wie
Point.sum
– sofern
Point3D
keine eigene Klassenmethode mit dem Namen
sum
definiert.
Aus stilistischen Gründen ist es zu bevorzugen, Klassenmethoden über das Klassenobjekt aufzurufen, für das sie definiert sind. Jemand, der den Code wartet und einen Ausdruck
Point3D.sum
vorfindet, wird erst einmal nach einer Definition von
sum
in der Klasse
Point3D
suchen und es eventuell schwer haben, die Methode in der Klasse
Point
zu finden. Wenn Sie eine Klassenmethode mit einem expliziten Empfänger aufrufen, sollten Sie es vermeiden, sich auf Vererbung zu verlassen — nutzen Sie die Klassenmethode immer mit der Klasse, für die sie definiert ist. [ 28 ]
Im Rumpf einer Klassenmethode können Sie die anderen Klassenmethoden der Klasse ohne einen expliziten Empfänger aufrufen — sie werden implizit für
self
aufgerufen, und der Wert von
self
in einer Klassenmethode ist die Klasse, für die sie aufgerufen wurde. Hier — im Rumpf einer Klassenmethode — ist die Vererbung von Klassenmethoden nützlich: Sie erlaubt Ihnen, eine Klassenmethode implizit aufzurufen, selbst wenn diese Methode in einer Superklasse definiert ist.
Schließlich sollten Sie beachten, dass Klassenmethoden
super
genauso nutzen können wie Instanzmethoden, um die gleichnamigen Methoden in der Superklasse aufzurufen.
7.3.5 Vererbung und Instanzvariablen
Instanzvariablen scheinen in Ruby oft geerbt zu sein. Schauen Sie sich zum Beispiel diesen Code an:
class Point3D < Point
def initialize(x,y,z)
super(x,y)
@z = z;
end
def to_s
"(#@x, #@y, #@z)" # Variablen @x und @y geerbt?
end
end
Die Methode
to_s
in
Point3D
verweist auf die beiden Variablen
@x
und
@y
aus der Superklasse
Point
. Dieser Code funktioniert so, wie Sie es vermutlich erwarten:
Point3D.new(1,2,3).to_s # => "(1, 2, 3)"
Da dieser Code sich wie gewünscht verhält, gehen Sie eventuell davon aus, dass diese Variablen vererbt werden. Allerdings läuft es in Ruby anders. Alle Ruby-Objekte haben ein Set von Instanzvariablen. Diese werden nicht durch die Klasse des Objekts definiert – sie werden einfach erzeugt, wenn ihnen ein Wert zugewiesen wird. Da Instanzvariablen nicht durch eine Klasse definiert werden, haben sie auch nichts mit Subklassen und Vererbungsmechanismen zu tun.
In diesem Code definiert
Point3D
eine Methode
initialize
, die die Methode
initialize
ihrer Superklasse nutzt. Die verkettete Methode weist den Variablen
@x
und
@y
Werte zu, wodurch diese Variablen für eine bestimmte Instanz von
Point3D
zum Leben erweckt werden.
Programmierer, die aus dem Java-Umfeld kommen — oder von anderen streng typisierten Sprachen, in denen eine Klasse eine Menge von Feldern für ihre Instanzen definiert -, brauchen vielleicht ein wenig, um sich daran zu gewöhnen. Aber es ist eigentlich ganz einfach: Die Instanzvariablen in Ruby werden nicht vererbt und haben
Weitere Kostenlose Bücher