next up previous contents index
Weiter: 8.2 Generische formale Hinauf: 8 Generische Einheiten Zurück: 8 Generische Einheiten

8.1 Ein einleitendes, umfangreicheres Beispiel

Mit Hilfe von generischen Einheiten lassen sich wiederverwendbare Software-Komponenten besonders vorteilhaft gestalten (siehe z.B. [Boo87a]). Damit ergibt sich auch die nicht unbedingt einfache Aufgabe, Bibliotheken von wiederverwendbaren und mehr oder minder öffentlich zugänglichen Software-Komponenten anzulegen und zu verwalten. Ein solcher Ansatz findet sich beispielsweise in [Con87].

Als Beispiel, wie solche Bibliothekseinträge aussehen könnten, betrachten wir einen Stack beliebiger Größe:

generic

type Element is private;

package Stack is

Stack_ist_leer: exception;

procedure Push(E: in Element);

procedure Pop (E: out Element);

end Stack;

package body Stack is

type Listen_Element;

type Zeiger_auf_Listen_Element is access Listen_Element;

type Listen_Element is
record
Eintrag: Element;
der_naechste: Zeiger_auf_Listen_Element;
end record;

Listen_Anfang: Zeiger_auf_Listen_Element;

procedure Push(E: in Element)
is
Zeiger_auf_neues_Element: Zeiger_auf_Listen_Element :=
new Listen_Element'(
Eintrag => E,
der_naechste => Listen_Anfang);
begin
Listen_Anfang := Zeiger_auf_neues_Element;
end Push;

procedure Pop (E: out Element)
is
begin
if Listen_Anfang /= null then
E := Listen_Anfang.Eintrag;
Listen_Anfang := Listen_Anfang.der_naechste;
else
raise Stack_ist_leer;
end if;
end Pop;

end Stack;

Eine Instantiierung dieses generischen Paketes könnte etwa lauten:

package Integer_Stack is new Stack(Element => integer);

Eine mögliche Verwendung dieser Instanz könnte folgenderweise aussehen:

...

for i in 1 .. N loop
Integer_Stack.Push (E => i);
end loop ;

...

declare
i: integer;
begin
loop
Integer_Stack.Pop (E => i);
-iverarbeiten
end loop;
exception
when Integer_Stack.Stack_Ist_leer =>
null;
end;

Im zweiten Teil dieses Programmfragmentes ist es nicht notwendig zu wissen, wieviele Elemente tatsächlich auf dem Integer_Stack liegen, das Ende wird über die ausgelöste Exception ermittelt.

Es gibt nun verschiedene Arten von generischen Parametern, nämlich: generische formale Objekte,  generische formale Typen,  generische formale Unterprogramme  und generische formale Pakete  Diese Parameter werden wir im folgenden erläutern. Für alle diese Parameter gilt, daß sie zwischen dem Schlüsselwort generic und einem der Schlüsselwörter procedure, function oder package stehen müssen.



next up previous contents index
Weiter: 8.2 Generische formale Hinauf: 8 Generische Einheiten Zurück: 8 Generische Einheiten

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