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:
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
null; -AnzahlderTagepasst
when Feber =
if Jahr mod 4 = 0 and jahr mod 1000
-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;
Johann Blieberger