Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Parametrisierte Klassen und Interfaces

Beim Arbeiten mit parametrisierten Klassen bzw. Interfaces sind 3 Schritte zu unterscheiden:

  1. Vorübersetzung einer parametrisierten Klasse bzw. Interface

  2. Nutzung einer parametrisierten Klasse bzw. Interface

  3. Expansion einer parametrisierten Klasse bzw. Interface

Die Vorübersetzung einer parametrisierten Klasse bzw. Interface erfolgt ohne Kenntnis der aktuellen Parameter. Ziel dabei ist zum einen die Erkennung von Syntaxfehlern. Zum anderen soll die Schnittstelle und der Quelltext der parametrisierten Klasse bzw. Interface im Repository abgelegt werden (siehe Abschnitt „Ein-/Ausgabe für Repositories"). Der Stand des Quelltextes, der Stand der COPY-Elemente und der Stand der Compiler-Direktiven (siehe Abschnitt „Quelldaten-Eingabe"), die die Übersetzungseinheit der parametrisierten Klasse bzw. Interface gegebenenfalls anspricht, werden zum Zeitpunkt der Vorübersetzung festgehalten und bei den späteren Nutzungen und Expansionen verwendet (d.h. nachträgliche Änderungen daran haben auf die Nutzung und Expansion keine Auswirkung mehr!).

Die Nutzung von parametrisierten Klassen bzw. Interfaces erfolgt in der Übersetzungseinheit durch die Verwendung von EXPANDS-Klauseln im REPOSITORY-Paragraf. Somit entstehen neue, konkrete Klassen bzw. Interfaces. Diese bestehen aus den in der Übersetzungseinheit angegebenen aktuellen Parametern und aus den bei der Vorübersetzung festgehaltenen Repository-Daten. Die konkreten Klassen bzw. Interfaces verhalten sich nun wie die nicht-parametrisierten Klassen bzw. Interfaces. Ihre Eigenschaften fließen in die Übersetzung des Nutzers der parametrisierten Klassen bzw. Interfaces ein.

Die Expansionen werden automatisch angestoßen im Anschluss an den Nutzer der parametrisierten Klassen bzw. Interface oder bei Übersetzungsgruppen nach der letzten Übersetzungseinheit. Dabei werden alle konkreten Klassen bzw. Interfaces übersetzt, die durch die Nutzung von parametrisierten Klassen bzw. Interfaces entstanden sind. Dazu werden lediglich die bei der Vorübersetzung erzeugten Daten der parametrisierten Klasse bzw. Interface und die aktuellen Parameter (einschließlich deren Repository-Daten) verwendet. Weitere Quelltexte, Bibliothekselemente oder Ähnliches sind für die Expansionen nicht erforderlich. Alle Compileroptionen (siehe Kapitel „Steuerung des Compilers über SDF"), die für die Übersetzungseinheit des Nutzers von parametrisierten Klassen bzw. Interfaces gültig sind, wirken wie bei Übersetzungsgruppen auch für die nachfolgenden Expansionen. Bei Expansionen wird jedoch keine Quellprogrammliste erzeugt. Die Wirkung von >>IMP-Direktiven wird nicht unterdrückt. Im Gegensatz dazu haben Compiler-Direktiven, die für den Nutzer von parametrisierten Klassen bzw. Interfaces gelten, für nachfolgende Expansionen keine Wirkung.

Weitere Details zu parametrisierten Klassen bzw. Interfaces finden Sie im Handbuch „COBOL2000-Sprachbeschreibung“ [1].

Beispiel 2-9

Vorübersetzung einer parametrisierten Klasse

Quelltext

CLASS-ID. pkl USING fp.——————————————————————————————————————————(1) 
...
REPOSITORY.
CLASS fp.
...
01 obj-fp USAGE OBJECT REFERENCE fp.
01 obj-pkl USAGE OBJECT REFERENCE pkl.
...

Zuweisung und Compileraufruf

/ADD-FILE-LINK REPOUT,REPOSITORY—————————————————————————————————(2) 
/START-COBOL2000-COMPILER ———————————————————————————————————————(3) 
/  ... UPDATE-REPOSITORY=*YES ...————————————————————————————————(4)

(1)

Der Name der parametrisierten Klasse ist pkl, der Name eines formalen Parameters ist fp.

(2)

Zur Aufnahme der Repository-Daten wird die Bibliothek REPOSITORY zugewiesen.

(3)

Die Vorübersetzung erfolgt durch den COBOL2000-Compiler; der Compiler erkennt selbstständig, ob eine Vorübersetzung durchzuführen ist - eine zusätzliche Steuerung ist dafür nicht erforderlich.

(4)

Die Repository-Daten werden als X-Element mit dem Namen PKL$PCL abgelegt (siehe Abschnitt „COMPILER-ACTION-Option").

Beispiel 2-10

Nutzung einer parametrisierten Klasse

Quelltext:

PROGRAM-ID. n.
...
REPOSITORY.
CLASS pkl
CLASS exp EXPANDS pkl USING ap—————————————————————————————————(1) 
CLASS ap.
...
01 obj-exp USAGE OBJECT REFERENCE exp.
...

Zuweisung und Compileraufruf:

/ADD-FILE-LINK REPLIB,REPOSITORY————————————————————————————————(2) 
/START-COBOL2000-COMPILER ...———————————————————————————————————(3)

(1)

Der Name der Expansion der parametrisierten Klasse ist exp, der Name des aktuellen Parameters ist ap.

(2)

Die Repository-Daten der vorübersetzten parametrisierten Klasse pkl sowie der (nicht-parametrisierten) Klasse ap werden in der Bibliothek REPOSITORY erwartet.

(3)

Im Anschluss an die Übersetzung von n erfolgt automatisch die Übersetzung der konkreten Expansion exp der parametrisierten Klasse pkl.

Im Falle von Abhängigkeiten zwischen verschiedenen Expansionen (Beispiel: die Expansion einer parametrisierten Klasse wird als aktueller Parameter für eine andere Expansion verwendet) muss bei der Übersetzung des Nutzers das Eingabe-Repository auch als Ausgabebibliothek zugewiesen und die Option
UPDATE-REPOSIORY=*YES gesetzt werden.

Beispiel 2-11

Expansion einer parametrisierten Klasse

temporär erzeugter Quelltext ———————————————————————————————————— (1)
CLASS-ID. exp USING ap.  ———————————————————————————————————————— (2)(3)
...
REPOSITORY.
    CLASS ap.  —————————————————————————————————————————————————— (3)
...
01 obj-fp USAGE OBJECT REFERENCE ap. ———————————————————————————— (3)
01 obj-pkl USAGE OBJECT REFERENCE exp. —————————————————————————— (2)
...

(1)

Die Erzeugung und Übersetzung erfolgen automatisch. Der Anwender muss dazu keinerlei zusätzliche Kommandos oder Anweisungen eingeben.

(2)

Der Name der parametrisierten Klasse wird an allen Stellen durch den Namen exp der konkreten Expansion ersetzt.

(3)

Der Name des formalen Parameters wird an allen Stellen durch den Namen ap des aktuellen Parameters ersetzt.

Der Compiler führt nachfolgende Expansionen nicht zwingend in der Reihenfolge aus, wie sie im Programm geschrieben wurden, sondern so, dass die erforderlichen Daten zu den aktuellen Parametern rechtzeitig vor der Expansion verfügbar sind.