next up previous contents index
Weiter: 7.2 Hinausgeschobene Konstanten-Definition Hinauf: 7 Pakete Zurück: 7 Pakete

7.1 Abstrakte Datentypen

  

Gewöhnlicherweise werden Pakete aber verwendet, um abstrakte Datentypen zu realisieren. Der Spezifikationsteil beinhaltet dann die Deklaration des Typs als private oder limited private, darauf folgen die für diesen Typ definierten Operationen in Form von Prozedur- und Funktionsspezifikationen. Im anschließenden Private-Teil findet sich die tatsächliche Datenstruktur, die - für den Benutzer nicht sichtbar, d.h., les- und/oder modifizierbar - den privaten Typ repräsentiert. Im Implementationsteil (body) finden sich dann die Implementationsteile der Prozeduren und Funktionen. Alle in einem Body deklarierten Typen und Objekte sind nur innerhalb dieses Body's sichtbar.

Nun können wir unser Beispiel aus Kapitel 2.5 wiederaufnehmen. Eine geeignete Spezifikation lautet:


package Datum_Manager is

subtype Tag_Typ is integer range 1 .. 31;

type Monatsname is (Jaenner, Feber, Maerz, April, Mai, Juni, Juli,
August, September, Oktober, November, Dezember);

subtype Jahr_Typ is integer range 0 .. 4000;

falsches_Datum: exception;

type Datum is private;

function Setze(
Tag: Tag_Typ;
Monat: Monatsname;
Jahr: Jahr_Typ)
return Datum;

function Tag(
von_Datum: Datum)
return Tag_Typ;

function Monat(
von_Datum: Datum)
return Monatsname;

function Jahr(
von_Datum: Datum)
return Jahr_Typ;

private

type Datum is
record
Tag: Tag_Typ;
Monat: Monatsname;
Jahr: Jahr_Typ;
end record;

end Datum_Manager;

Eine passende Implementierung umfaßt nun die Implementierung der Unterprogramme, die im Spezifikationsteil des Paketes angegeben worden sind:


package body Datum_Manager is

function Setze(
Tag: Tag_Typ;
Monat: Monatsname;
Jahr: Jahr_Typ)
return Datum
is
Dat: Datum := (Tag, Monat, Jahr);
-hierkannmanaufdieKomponentenvonDatumzugreifen
begin
case Monat is
when Jaenner Maerz Mai Juli August Oktober Dezember =>
null; -AnzahlderTagepasst
when Feber =>
if Jahr mod 4 = 0 and jahr mod 1000 0 then
-Schaltjahr
if Tag not in 1 .. 29 then
raise falsches_Datum;
end if;
else
-keinSchaltjahr
if Tag not in 1 .. 28 then
raise falsches_Datum;
end if;
end if;
when others =>
-hierkommendieMonatemitTagen
if Tag not in 1 .. 30 then
raise falsches_Datum;
end if;
end case;
return Dat;
end Setze;

function Tag(
von_Datum: Datum)
return Tag_Typ
is
begin
return von_Datum.Tag;
end Tag;

function Monat(
von_Datum: Datum)
return Monatsname
is
begin
return von_Datum.Monat;
end Monat;

function Jahr(
von_Datum: Datum)
return Jahr_Typ
is
begin
return von_Datum.Jahr;
end Jahr;

begin
null;
end Datum_Manager;

Wenn wir Initialisierungen vornehmen wollten, müßten wir diese anstelle der Null-Anweisung vor dem Ende des Paketes einfügen. Da wir das nicht wollen, könnten wir die Anweisungen begin null; am Ende des Body's auch weglassen.



next up previous contents index
Weiter: 7.2 Hinausgeschobene Konstanten-Definition Hinauf: 7 Pakete Zurück: 7 Pakete

Johann Blieberger
Wed Feb 11 09:58:52 MET 1998