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

7.3 Zugriff auf in Paketen deklarierte Objekte

 

Es bleibt die Frage zu beantworten, wie man auf jene Objekte zugreift, die im sichtbaren Teil eines Paketes deklariert worden sind. Innerhalb des Paketes, das die Deklaration enthält, und innerhalb des zugehörigen Body's kann man auf das deklarierte Objekt zugreifen, indem man den spezifizierten Namen verwendet.

Nehmen wir nun an, wir hätten im sichtbaren Teil des Paketes A ein Objekt O deklariert, und wir wollen vom Paket B auf dieses Objekt zugreifen. Ada erlaubt das durch explizites Nennen des Paketes, in dem sich das Objekt befindet, vor dem Objekt-Namen. Die Trennung der beiden Namen erfolgt durch einen Punkt. In unserem Beispiel heißt das

A.O

Das ist jedoch nur möglich, wenn man vor dem Spezifikations- oder Implementationsteil des Paketes B kund tut, daß man Objekte des Paketes A verwenden will. Das tut man mit

with A;

   Es können sogar beliebig viele, durch Beistriche getrennte Pakete angegeben werden, auf die man sich beziehen will. Man sagt dann, alle in einer With-Anweisung angegebenen Pakete sind in dem entsprechenden Paket sichtbar.  

Es sei explizit darauf hingewiesen, daß man sich vom Spezifikations- und Implementationsteil eines Paketes auf unterschiedliche Pakete beziehen kann. Dadurch ist die Spezifikation unabhängiger von der Implementierung. Ein Body erbt jedoch implizit die Pakete, auf die man sich im Spezifikationsteil bezogen hat.

Durch diesen Mechanismus können sehr lange Namen auftreten. Um diese zu vermeiden, gibt es in Ada zwei verschiedene Möglichkeiten. Die erste ist die, daß man unmittelbar nach der With-Anweisung eine Use-Anweisung   angibt, z.B.:

with A;
use A;

Dies bewirkt, daß man auf Objekte, die im Paket A definiert sind ohne das Prefix A. zugreifen kann, und zwar innerhalb des gesamten betroffenen Paketes. Dabei kann es natürlich zu Namenskollisionen kommen, die entsprechend aufgelöst werden müssen.

Wenn man für einen selbstdefinierten Typ Operatoren wie etwa ''+''oder ''*''überlädt, würde man immer eine Use-Klausel benötigen, um die Infix-Notation (z.B. a+b) verwenden zu könnengif. Damit sind aber dann auch alle anderen in dem entsprechenden Paket deklarierten Typen, Objekte und Operationen ohne den Paketnamen-Prefix verwendbar. Um nur die Operatoren in Infix-Notation verwenden zu können, für alle anderen im Paket deklarierten Programmteile aber den Paketnamen-Prefix verwenden zu müssen, gibt es in Ada die Use-Type-Klausel. Man schreibt dann statt use A; zum Beispiel use type A.My_Type;.

Die andere Möglichkeit ist die von Renames-Anweisungen.  

Asterix: Aber Samson Himmelschorus,
Himmelschorus hat so eine
lateinische Endung?

Himmelschorus: Ich habe den Namen aus
kommerziellen Gründen angenommen!
In Wirklichkeit heiße ich
Rosenblumenthalowitsch!


Rene Goscinny  und Albert Uderzo ,
,,Die Odyssee``.

Man kann sie einerseits verwenden, um Pakete umzubenennen, z.B.:

package DM renames Datum_Manager;

andererseits kann man damit einzelne Objekte eines Paketes umbenennen, z.B.:

function Set(
Tag: Tag_Typ;
Monat: Monatsname;
Jahr: Jahr_Typ)
return Datum_Manager.Datum
renames Datum_Manager.Setze;



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

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