Java Reference
In-Depth Information
Wenn das liskovsche Substitutionsprinzip nicht gelten würde,
müsste stets geprüft werden, von welchem Typ das aktuelle Ob-
jekt ist, auf welches die Referenz gerade verweist.
Der Vertrag einer Klasse umfasst die Vor- und Nachbedingungen der Methoden und
die Invarianten einer Klasse. Dabei kann eine Klasse mit verschiedenen Kundenklas-
sen verschiedene Verträge haben. Was es bedeutet, dass ein Vertrag durch eine ab-
geleitete Klasse nicht gebrochen werden darf, wird in Kapitel 1.7 erläutert.
Vorsicht!
Man muss das liskovsche Substitutionprinzip unter zwei Gesichtspunkten betrachten:
1. Erweitert eine Klasse eine andere Klasse nur und überschreibt nichts, sondern fügt
nur Attribute und Methoden hinzu, dann ist ganz klar, dass eine Instanz einer abge-
leiteten Klasse an die Stelle einer Instanz ihrer Basisklasse treten kann. Dabei wird
nämlich einfach durch einen Cast der erweiternde Anteil wegprojiziert. Zusätzliche
Methoden der abgeleiteten Klasse werden dabei nicht angesprochen. Bei einer rei-
nen Erweiterung wird bei der Ableitung keine Methode überschrieben.
2. Dieses Casten erfolgt natürlich auch, wenn die abgeleitete Klasse Methoden der
Basisklasse überschreibt. Im Fall einer späten Bindung von Instanzmethoden wie in
Java wird dann die überschreibende Methode an Stelle der überschriebenen Me-
thode aufgerufen. Das darf aber keinen schädlichen Einfluss auf den Ablauf des
Programms haben! Dies erzwingt, dass der Programmierer beim Überschreiben da-
für sorgen muss, dass die überschreibende Instanzmethode den Vertrag der ent-
sprechenden überschriebenen Instanzmethode einhält.
Werden Instanzmethoden in einer abgeleiteten Klasse über-
schrieben, so tritt in der abgeleiteten Klasse die überschreiben-
de Instanzmethode an die Stelle der ursprünglichen, über-
schriebenen Methode. Wird ein Objekt der abgeleiteten Klasse
als Objekt der Basisklasse betrachtet, wird trotzdem die über-
schriebene Methode aufgerufen, also für jedes Objekt die Me-
thode seines Typs.
Beispiel:
Bild 1-4 zeigt eine Klassifikation von Vögeln. Die abstrakte Klasse Vogel deklariert die
abstrakten Operationen essen() und fliegen() .
Ein Pinguin ist ein Vogel, er ist jedoch flugunfähig. Bei Einsatz der Vererbung muss
aber die Methode, die das Fliegen abbildet, in einer abgeleiteten Klasse vorhanden
sein. Daher ist der im Folgenden gezeigte Entwurf einer Vererbungshierarchie falsch:
Search WWH ::




Custom Search