Die Programmiersprache Ruby (German Edition)
Methodenaufrufe für
self
. Es gibt zwei Möglichkeiten, diese Methoden aufzurufen. Ohne Argumente legen sie fest, dass alle folgenden Methodendefinitionen die angegebene Sichtbarkeit besitzen. Eine Klasse kann sie wie folgt nutzen:
class Point
# Hier stehen öffentliche Methoden.
# Die folgenden Methoden sind geschützt.
protected
# Hier stehen geschützte Methoden.
# Die folgenden Methoden sind privat.
private
# Hier stehen private Methoden.
end
Die Methoden können auch mit den Namen einer oder mehrerer Methoden (als Symbole oder Strings) als Argumenten aufgerufen werden. Nutzt man sie so, ändern sie die Sichtbarkeit der angegebenen Methoden. In diesem Fall muss die Deklaration der Sichtbarkeit nach der Definition der Methode vorgenommen werden. Eine mögliche Vorgehensweise ist, alle privaten und geschützten Methoden auf einmal am Ende einer Klasse zu deklarieren. Oder man deklariert die Sichtbarkeit jeder privaten oder geschützten Methode direkt nach ihrer Definition. Hier sehen Sie zum Beispiel eine Klasse mit einer privaten Hilfsmethode und einer geschützten Akzessormethode:
class Widget
def x # Akzessormethode für @x
@x
end
protected :x # Geschützt machen
def utility_method # Definiere eine Methode
nil
end
private :utility_method # und mache sie privat
end
Denken Sie daran, dass
public
,
private
und
protected
in Ruby nur bei Methoden angewendet werden. Instanz- und Klassenvariablen sind gekapselt und automatisch privat, während Konstanten öffentlich sind. Es gibt keine Möglichkeit, eine Instanzvariable nach außen zugänglich zu machen (außer natürlich über die Definition einer Akzessormethode). Und es gibt keine Möglichkeit, eine Konstante zu definieren, die sich nicht von außerhalb der Klasse aus ansprechen lässt.
Manchmal ist es nützlich, festzulegen, dass eine Klassenmethode privat sein sollte. Wenn Ihre Klasse zum Beispiel Fabrikmethoden definiert, wollen Sie vielleicht die Methode
new
privat machen. Dazu verwenden Sie die Methode
private_class_method
und geben einen oder mehrere Namen als Symbole an:
private_class_method :new
Sie können eine private Klassenmethode mithilfe von
public_class_method
wieder öffentlich machen. Beide Methoden lassen sich nicht ohne Attribute aufrufen, wie das bei
public
,
protected
und
private
der Fall ist.
Ruby ist vom Design her eine sehr offene Sprache. Die Möglichkeit, festzulegen, dass manche Methoden privat oder geschützt sind, sorgt für einen guten Programmierstil und verhindert eine unachtsame Verwendung von Methoden, die nicht Teil der öffentlichen API einer Klasse sind. Es ist allerdings wichtig, zu verstehen, dass es die Metaprogrammierungsfähigkeiten von Ruby einfach machen, private und geschützte Methoden aufzurufen und sogar gekapselte Instanzvariablen anzusprechen. Um die private Hilfsmethode aufzurufen, die oben im Code definiert wurde, können Sie die Methode
send
oder
instance_eval
verwenden, um einen Block im Kontext des Objekts auszuwerten:
w = Widget.new # Erstelle ein Widget
w.send :utility_method # Aufruf einer privaten Methode!
w.instance_eval { utility_method } # Oder so aufrufen
w.instance_eval { @x } # Lesen einer Instanzvariablen von w
Wenn Sie eine Methode über ihren Namen aufrufen, aber nicht ungewollt eine private Methode erwischen wollen, von der Sie nichts wissen, können Sie (in Ruby 1.9)
public_send
anstelle von
send
nutzen. Das funktioniert wie
send
, ruft aber keine privaten Methoden auf, wenn diese mit einem expliziten Empfänger genutzt werden.
public_send
wird in Kapitel 8 behandelt, zusammen mit
send
und
instance_eval
.
7.3 Subklassen und Vererbung
Die meisten objektorientierten Programmiersprachen — so auch Ruby — stellen einen Mechanismus zum Definieren von Subklassen bereit, mit dem wir neue Klassen erzeugen können, deren Verhalten auf einer bestehenden Klasse basiert, sich aber davon unterscheiden kann. Wir werden diesen Abschnitt mit einer Definition der grundlegenden Begriffe beginnen. Wenn Sie schon in Java, C++ oder einer ähnlichen Sprache entwickelt haben, werden Ihnen diese Begriffe wahrscheinlich vertraut vorkommen.
Wenn wir eine Klasse definieren, können wir festlegen, dass sie eine andere Klasse erweitert oder von ihr erbt . Diese Ursprungsklasse wird als Superklasse bezeichnet. Wenn wir eine Klasse
Ruby
definieren, die eine Klasse
Gem
erweitert, sagen wir, dass
Ruby
eine Subklasse von
Gem
ist und dass
Gem
die Superklasse von
Ruby
ist. Wenn Sie beim Definieren einer
Weitere Kostenlose Bücher