8. Objektorientierte Programmierung
 
zurück
8.7 Abstrakte Klassen


Wenn zum Zeitpunkt, zu dem eine Anwendung einer Klasse geschrieben werden soll, noch keine Entscheidung über die darin aufzunehmenden Typen getroffen ist, können abstrakte Klassen verwenden werden, um ein (kompilierbares) Gerüst für eine Klassenhierarchie zu entwerfen. Die Konkretisierung der Typen und Unterprogramme muß dann später in den abgeleiteten Klassen erfolgen.

Abstrakte Typen und Unterprogramme (Abstrakte Klasse / Abstrakter Typ / Abstrakte Unterprogramme) dienen zur Bildung von ganz allgemeinen Basisklassen. Die abstrakte Klasse liefert Vorgaben von Datentypen und Operationen, aber keine Implementierungen. Von abstrakten Klassen können dementsprechend auch keine Objekte gebildet werden. Dies ist erst mit den davon abgeleiteten, konkreten Klassen möglich.

In einer abstrakten Basisklasse könnten z. B. allgemeine Funktionen zum Lesen und Schreiben von Objekten auf Datenträger bereitgestellt werden. Anschließend werden von dieser Basisklasse unterschiedliche Klassen abgeleitet. Diese Klassen haben dann als einzige Gemeinsamkeit genau diese Schreib-/Lese-Prozeduren der abstrakten Basisklasse.

Die von einer abstrakten Basisklasse bereitgestellten abstrakten Prozeduren müssen in den abgeleiteten Klassen konkretisiert werden. Der Übersetzer prüft, ob alle abstrakten Rümpfe in allen Subklassen konkretisiert werden.

Eine abstrakte Basisklasse kann aber auch "normale" Prozeduren bereitstellen, die nicht konkretisiert werden müssen.

(record_type_definition <BNF>)
(abstract_subprogram_declaration <BNF>)

Der Datentyp der abstrakten Basisklasse wird als "abstract tagged null record" gekennzeichnet. Deklariert wird nur die Spezifikation des Paketes, kein Rumpf.

Alle Unterprogramme, die erst später konkretisiert werden sollen, werden hier als "abstract" gekennzeichnet.


-- die abstrakte Basisklasse

package Grafikelement is
   -- den abstrakten Datentyp der Basisklasse deklarieren:
   type Abstraktes_Grafikelement is abstract tagged null record;

   -- Eine abstrakte Prozedur zum Zeichnen deklarieren:
   procedure Zeichnen ( R : IN OUT Abstraktes_Grafikelement ) is abstract;
end Grafikelement;


Eine von einer abstrakten Klasse abgeleitete Klasse muß den Datentyp der abstrakten Basisklasse aufgreifen und um eigene Verbundelemente erweitern.

Die abstrakten Unterprogramme der abstrakten Basisklasse müssen durch gleichnamige Unterprogramme überladen werden. Der Übersetzer prüft, ob alle abstrakten Unterprogramme überladen wurden.


-- eine von einer abstrakten Basisklasse abgeleitete Klasse


with Grafikelement;
package Klasse_Rechteck is

   type Objekt_Farbe is ( rot, blau, gruen );

   -- Die Klasse Rechteck von der abstrakten Basisklasse
   -- Abstraktes_Grafikelement ableiten und die abstrakte
   -- Komponentenfunktion "Zeichnen" konkretisieren :

   --Erweiterung des abstrakten Typs mit neuen Elementen:
   type Rechteck is new Grafikelement.Abstraktes_Grafikelement with record
      Laenge : float;
      Breite : float;
      Farbe : Objekt_Farbe;
   end record;

   -- erzeuge ein Rechteck: (neue Prozedur)
   procedure Erzeuge ( R : IN OUT Rechteck; LAENGE : IN Float; BREITE : IN Float );

   -- zeichne das Rechteck: (überladene Prozedur)
   procedure Zeichnen ( R : IN OUT Rechteck );
end Klasse_Rechteck;



 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.