next up previous contents index
Weiter: 11.4 Das Hauptprogramm Hinauf: Programmstruktur und Übersetzungsvorgang Zurück: Übersetzungs- und Bibliothekseinheiten

Untereinheiten von Übersetzungseinheiten

 

Ada bietet allerdings noch zusätzliche Unterstützung für getrennt übersetzbare Untereinheiten von Übersetzungseinheiten. Es ist beispielsweise erlaubt, anstelle der Implementation eines Unterprogrammes, eines Paketes, eines Tasks oder eines geschützten Objektes

is separate;

zu schreiben, und die tatsächliche Implementation erst in einer Untereinheit zu realisieren. So eine Untereinheit sieht dann so aus, daß man sie mit separate (<Vater_Einheit>) einleitet (wobei die entsprechende Vater-Einheit, wie Paket oder Unterprogramm, anzuführen ist) und danach eine korrekte Implementierung folgen läßt. Etwaig notwendige With-Anweisungen sind nötigenfalls vor dem Schlüsselwort separate anzugeben. Klarerweise kann auch innerhalb einer Untereinheit mit is separate auf weitere Untereinheiten verwiesen werden. Dabei verlängert sich der Name der Vater-Einheit entsprechend um die neu hinzugekommene Untereinheit, die, mit einem Punkt getrennt, hinten anzuhängen ist, z.B. (vgl. das Beispiel aus Kapitel 7):

separate (Datum_Manager.Setze)

falls wir ein in Datum_Manger.Setze lokal definiertes Unterprogramm getrennt übersetzen wollen.

Die Implementierung unseres Paketes Datum_Manager könnte also auch folgendermaßen lauten:


package body Datum_Manager is

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

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;


separate(Datum_Manager)
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;

Dabei können der Body von Datum_Manager und der separate Teil getrennt übersetzt werden.

next up previous contents index
Weiter: 11.4 Das Hauptprogramm Hinauf: Programmstruktur und Übersetzungsvorgang Zurück: Übersetzungs- und Bibliothekseinheiten

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