Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
passende Definition oder Redefinition der Methode gefunden wird. Das bedeutet, dass der Methodenaufruf nicht statisch beim Parsen gebunden, sondern während der Ausführung gesucht wird. Hier sehen Sie ein Beispiel, das diesen wichtigen Punkt zeigt:
# Grüße an die Welt
class WorldGreeter
def greet # Gruß anzeigen
    puts "#{greeting} #{who}"
end
def greeting # Welcher Gruß
    "Hallo"
end
def who # Welcher Empfänger
    "Welt"
end
end
# Grüße an die Welt in Spanisch
class SpanishWorldGreeter < WorldGreeter
def greeting # Überschreiben des Grußes
    "Hola"
end
end
# Wir rufen eine Methode auf, die in WorldGreeter definiert ist, aber die
# überschriebene Version von SpanishWorldGreeter nutzt. Ausgabe ist "Hola Welt".
SpanishWorldGreeter.new.greet
    Wenn Sie schon objektorientiert programmiert haben, ist dieses Verhalten für Sie vermutlich offensichtlich und ganz klar. Aber wenn das für Sie Neuland ist, mag es überraschend sein. Wir rufen die Methode
greet
auf, die von
WorldGreeter
geerbt wurde. Diese Methode
greet
ruft wiederum die Methode
greeting
auf. Bei der Definition von
greet
lieferte die Methode
greeting
»Hallo« zurück. Aber wir haben eine Subklasse von
WorldGreeter
gebildet und das Objekt, für das wir
greet
aufrufen, hat eine neue Definition von
greeting
. Wenn wir
greeting
aufrufen, schaut Ruby nach der passenden Definition dieser Methode für das aufrufende Objekt, und wir landen bei einem passenden spanischen Gruß statt bei einem deutschen. Dieses Nachschlagen der passenden Definition einer Methode zur Laufzeit wird als Methodennamensauflösung ( Method Name Resolution ) bezeichnet und ist detailliert in „7.8 Methoden-Lookup“ am Ende dieses Kapitels beschrieben.
    Beachten Sie, dass es auch gute Gründe geben kann, eine abstrakte Klasse zu definieren, die bestimmte undefinierte, »abstrakte« Methoden aufruft, die erst in Subklassen definiert werden. Das Gegenteil von abstrakt ist konkret . Eine Klasse, die eine abstrakte Klasse erweitert, ist konkret, wenn sie alle abstrakten Methoden ihrer Vorfahren definiert, zum Beispiel:
# Diese Klasse ist abstrakt, greeting oder who sind nicht definiert.
# Es ist keine besondere Syntax notwendig: Jede Klasse, die Methoden aufruft,
# die in einer Subklasse implementiert werden sollen, ist abstrakt.
class AbstractGreeter
def greet
    puts "#{greeting} #{who}"
end
end
# Eine konkrete Subklasse
class WorldGreeter < AbstractGreeter
def greeting; "Hallo"; end
def who; "Welt"; end
end
WorldGreeter.new.greet # Anzeige "Hallo Welt"
    7.3.2.1 Überschreiben privater Methoden
    Private Methoden können nicht von außerhalb der Klasse aufgerufen werden, in der sie definiert sind. Aber sie werden von Subklassen geerbt. Das bedeutet, dass Subklassen sie aufrufen und überschreiben können.
    Seien Sie vorsichtig, wenn Sie von einer Klasse ableiten, die Sie nicht selber geschrieben haben. Klassen nutzen häufig private Methoden als interne Hilfsmethoden. Sie sind nicht Teil der öffentlichen API der Klasse und auch nicht dazu gedacht, sichtbar zu sein. Wenn Sie den Quellcode der Klasse nicht gelesen haben, kennen Sie nicht einmal die Namen der privaten Methoden, die die Klasse für ihre eigenen Zwecke definiert hat. Wenn Sie zufällig eine Methode (unabhängig von ihrer Sichtbarkeit) in Ihrer Subklasse definieren, die denselben Namen wie eine private Methode in der Superklasse hat, haben Sie unabsichtlich die interne Hilfsmethode der Superklasse überschrieben, was mit großer Sicherheit zu unerwünschtem Verhalten führt.
    Die Schlussfolgerung daraus ist, dass Sie in Ruby nur dann Subklassen bilden sollten, wenn Sie mit der Implementierung der Superklasse vertraut sind. Wenn Sie nur von der öffentlichen API einer Klasse abhängig sein wollen und nicht von ihrer Implementierung, sollten Sie die Funktionalität der Klasse erweitern, indem Sie sie kapseln und an sie delegieren, anstatt von ihr abzuleiten.
    7.3.3 Erweitertes Verhalten durch Verkettung
    Manchmal wollen wir beim Überschreiben einer Methode die »alte« Methode nicht komplett ersetzen, sondern nur das Verhalten erweitern, indem wir neuen Code hinzufügen. Dazu brauchen wir einen Weg, die überschriebene aus der überschreibenden Methode aufrufen zu können. Dies ist als Verkettung bekannt und lässt sich über das Schlüsselwort
super
erreichen.
    super
benimmt sich wie ein spezieller Methodenaufruf: Es führt eine Methode mit dem gleichen Namen wie dem der aktuellen aus – aber aus der Superklasse der

Weitere Kostenlose Bücher