Beim Arbeiten mit parametrisierten Klassen bzw. Interfaces sind 3 Schritte zu unterscheiden:
Vorübersetzung einer parametrisierten Klasse bzw. Interface
Nutzung einer parametrisierten Klasse bzw. Interface
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 |
(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 |
(2) | Die Repository-Daten der vorübersetzten parametrisierten Klasse |
(3) | Im Anschluss an die Übersetzung von |
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 |
(3) | Der Name des formalen Parameters wird an allen Stellen durch den Namen |
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.