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:
nichts mit dem Vererbungsmechanismus zu tun. Der Grund dafür, dass sie manchmal als geerbt erscheinen, liegt nur darin, dass Instanzvariablen von denjenigen Methoden erstellt werden, die ihnen zuerst Werte zuweisen — und diese Methoden werden oft vererbt oder verkettet.
    Das hat einen entscheidenden Effekt: Da Instanzvariablen nichts mit der Vererbung zu tun haben, folgt daraus, dass eine Instanzvariable, die von einer Subklasse verwendet wird, keine Instanzvariable einer Superklasse »verdecken« kann. Wenn eine Subklasse eine Instanzvariable mit demselben Namen wie eine Variable in einer ihrer Vorfahren nutzt, wird damit der Wert dieser Vorfahrenvariablen überschrieben. Das kann mit Absicht geschehen, um das Verhalten des Vorfahren zu ändern, oder unabsichtlich. Im letzteren Fall ist das eine sichere Quelle für Fehler. Wie bei der Vererbung von privaten Methoden (weiter oben beschrieben), ist dies ein weiterer Grund dafür, dass Sie Ruby-Klassen nur dann erweitern sollten, wenn Sie mit ihrer Implementierung vertraut sind (und die Kontrolle darüber haben).
    Schließlich sollten Sie sich in Erinnerung rufen, dass Klasseninstanzvariablen einfach Instanzvariablen des
Class
-Objekts sind, das ein Klasse repräsentiert. Damit werden auch sie nicht vererbt. Des Weiteren sind die Objekte
Point
und
Point3D
(wir sprechen hier über die
Class
-Objekte selbst, nicht die Klassen, die sie repräsentieren) beide einfach nur Instanzen von
Class
. Es gibt keine Beziehung zwischen ihnen und keine Möglichkeit, dass eine Klasse Variablen von der anderen erbt.
    7.3.6 Vererbung und Klassenvariablen
    Klassenvariablen werden von einer Klasse und all ihren Subklassen gemeinsam genutzt. Wenn eine Klasse
A
eine Variable
@@a
verwendet, kann die Subklasse
B
diese Variable ebenfalls nutzen. Auch wenn das wieder einmal wie Vererbung aussieht, ist es in Wirklichkeit etwas anderes.
    Der Unterschied wird klar, wenn wir uns anschauen, wie der Wert einer Klassenvariablen gesetzt wird. Wenn eine Subklasse einer Klassenvariablen einen Wert zuweist, die schon von einer Superklasse verwendet wird, erzeugt die Subklasse keine eigene, private Kopie der Klassenvariablen, sondern ändert nur den Wert, den die Superklasse sieht. Zudem ändert sich damit auch der Wert, den alle anderen Subklassen der Superklasse sehen. Ruby 1.8 gibt in so einem Fall eine Warnung aus, wenn Sie es mit
-w
ausführen. Ruby 1.9 gibt diese Warnung nicht aus.
    Wenn eine Klasse Klassenvariablen verwendet, kann jede beliebige Subklasse das Verhalten der Klasse und aller ihrer Nachkommen ändern, indem es den Wert der gemeinsam genutzten Klassenvariablen anpasst. Das ist ein wichtiges Argument für die Verwendung von Klasseninstanzvariablen anstelle von Klassenvariablen.
    Der folgende Code zeigt die gemeinsame Nutzung von Klassenvariablen. Die Ausgabe ist
123
.
class A
@@value = 1 # Eine Klassenvariable
def A.value; @@value; end # Eine Akzessormethode für sie
end
print A.value # Ausgabe des Werts der Klassenvariable von A
class B < A; @@value = 2; end # Subklasse ändert die gemeinsam genutzte
     # Klassenvariable
print A.value # Superklasse sieht geänderten Wert
class C < A; @@value = 3; end # Nochmals Änderung der Variablen durch eine
     # Subklasse
print B.value # Erste Subklasse sieht Wert aus der zweiten
     # Subklasse
    7.3.7 Vererbung von Konstanten
    Konstanten werden vererbt und können überschrieben werden, so ähnlich wie bei den Instanzmethoden. Es gibt allerdings einen sehr wichtigen Unterschied zwischen der Vererbung von Methoden und der von Konstanten.
    Unsere Klasse
Point3D
kann zum Beispiel die Konstante
ORIGIN
verwenden, die von ihrer Superklasse
Point
definiert wurde. Obwohl es sauberer ist, Konstanten über ihre definierende Klasse zu qualifizieren, kann
Point3D
diese Konstanten auch mit einem nicht qualifizierten
ORIGIN
oder sogar per
Point3D::ORIGIN
referenzieren.
    Interessant wird die Vererbung von Konstanten, wenn eine Klasse wie
Point3D
eine Konstante redefiniert. Eine Klasse für dreidimensionale Punkte wird vermutlich eine Konstante namens
ORIGIN
haben wollen, um einen dreidimensionalen Punkt zu referenzieren, also sollte in
Point3D
eine Zeile wie die folgende stehen:
ORIGIN = Point3D.new(0,0,0)
    Wie Sie wissen, gibt Ruby eine Warnung aus, wenn eine Konstante redefiniert wird. In diesem Fall handelt es sich allerdings um eine neu erzeugte Konstante. Wir haben jetzt zwei Konstanten:
Point::ORIGIN
und
Point3D::ORIGIN
.
    Der entscheidende Unterschied

Weitere Kostenlose Bücher