8. Objektorientierte Programmierung | ||||||
|
||||||
8.4 Vererbung
Eine weitere Eigenschaft der "tagged"-Verbundtypen, also der Klassen von Ada 95, ist die Möglichkeit der Programmierung durch Erweiterung ("programming by extension"). Durch die Ableitung (Vererbung) von einem vorhandenen "tagged"-Verbundtyp wird ein neuer "tagged"-Verbundtyp erzeugt, der mit neuen Verbundtyp-Elementen und Operationen versehen werden kann (derived_type_definition <BNF>). Klassen, die von anderen Klassen abgeleitet werden, bezeichnet man als "abgeleitete Klassen", die Ursprungsklasse heißt "Basisklasse". Man deklariert einen neuen "tagged"-Verbundtyp (eine abgeleitete Klasse) unter Verwendung einer vorhandenen Klasse und "erbt" sozusagen die Verbundtyp-Komponenten und alle darauf definierten Operationen. Beispiel: Erweiterung einer Basisklasse
Der Datentyp "Linie" ist eine Klasse, die von der Basisklasse "Punkt" abgeleitet wurde. "Linie" besteht nun insgesamt aus fünf Verbundtyp-Elementen und verhält sich so, als wäre "Linie" als Verbundtyp mit fünf Elementen deklariert worden. Die Verbundtyp-Komponenten "Farbe", "x" und "y" wurden von der Basisklasse "Punkt" an die Klasse "Linie" vererbt, und die Verbundtyp-Komponenten "x1" und "y1" wurden hinzugefügt. Bei der weiteren Verwendung von "Linie" besteht aus Benutzersicht kein Unterschied zwischen diesem Typ und einem äquivalenten Typ mit fünf Elementen, der auf herkömmliche Art und Weise (also ohne die Angabe "tagged") deklariert wurde. Aufbauend auf der Basisklasse Punkt werden die Spezifikation und der Rumpf für Linie gebildet.
Die Prozeduren "Erzeuge" und "Zeichnen" müssen neu erstellt werden, weil sie spezielle Aufgaben haben (Manipulation der Elemente "x1" und "y1"), die von den überladenen Prozeduren der Klasse "Punkt" nicht übernommen werden können. Die Prozedur "Farbe_aendern" der Klasse "Punkt" wird jedoch nicht neu erstellt oder überladen, weil sie sowohl für Objekte der Klasse "Punkt" als auch für sämtliche abgeleiteten Klassen richtig funktioniert. Grund: "Farbe_aendern" manipuliert nur das Element "Farbe", das sowohl in der Basisklasse als auch in allen abgeleiteten Klassen enthalten ist. Rumpf von <Linie> :
Duch die Vererbung bekommt eine abgeleitete Klasse die Möglichkeit, auf Daten und Komponentenfunktionen einer anderen Klasse zuzugreifen. Für neue Aufgaben stellt sie eigene Komponentenfunktionen zur Verfügung. Beachte: Durch die Möglichkeit, vorhandene Klassen durch Vererbung zu erweitern, kann man die Funktionalität von vorhandenen Klassen erweitern, ohne Änderungen in der bestehenden oder übernommenen Software vornehmen zu müssen. Dieses wirkt sich positiv auf die Wartbarkeit aus, weil Änderungen in vorhandenen Programmteilen weitgehend entfallen.
Angenommen, zwei Klassen "Punkt" und "Linie" und die zugehörigen Operationen wären fertig und getestet in Paketen enthalten, dann kann die Funktionalität der Klassen durch Einführung einer neuen Klasse "Rechteck" erweitert werden, ohne die Pakete "Punkt" und "Linie" ändern oder rekompilieren zu müssen. Für jedes Objekt einer Klasse wird immer die passende Prozedur aufgerufen. Für ein Objekt der Klasse "Linie" wird zum Erzeugen immer die Prozedur "Erzeuge" der Klasse "Linie" aufgerufen und nicht eine gleichnamige Prozedur einer anderen Klasse. Die Prozedur "Farbe_aendern" der Klasse "Punkt" ist nur einmal vorhanden, weil sie sowohl für Objekte der Klasse "Punkt" als auch für sämtliche abgeleiteten Klassen richtig funktioniert. Grund: "Farbe_aendern" manipuliert nur das Element "Farbe", das sowohl in der Basisklasse als auch in allen Unterklassen (abgeleiteten Klassen) enthalten ist. Die Klasse "Rechteck" hat keine neuen Datentypen, die die Klasse erweitern. Die Koordinaten (x,y, x1,y1) werden aber für ein Rechteck anders als bei einer Linie interpretiert, so daß sich die Notwendigkeit für eine neue Klasse ergibt. Weil keine neuen Datentypen dazukommen, ergibt sich folgende Schreibweise (record_definition <BNF>): |
||||||
|
||||||
|