Programmiersprache Pascal

Geschützte Datentypen

Geschützte Datentypen (restricted types) werden mit Extended Pascal eingeführt.
  TYPE name = RESTRICTED bezugsdatentyp
Der neu definierte Datentyp besitzt die gleiche Struktur wie bezugsdatentyp, jedoch gelten restriktivere Zugriffsregeln.

bezugsdatentyp ist vorzugsweise ein strukturierter Datentyp.
Variablen mit geschützten Datentyp schirmen ihre Komponenten einem unmittelbaren Zugriff ab.

Sinnvoll eingesetzt werden können geschützte Datentypen im Zusammenhang mit Moduln:
Ein Modul exportiert

Exportiert werden geschützte Datentypen. Der Nutzer kann dann auf die dadurch beschriebenen Daten nur über die bereitgestellten Zugriffsroutinen zugreifen. Die Struktur der Daten bleibt ihm unzugänglich, ein direkter Zugriff auf die Komponenten ist ihm verwehrt.

Ein Variable mit geschützten Datentyp darf als aktueller Parameter an ein Unterprogramm übergeben werden, welches einen ungeschützten Datentyp als formalen Parameter vorsieht. Dies gilt sowohl für Wert- als auch für Variablenparameter.

Mit PRIVATE oder PROTECTED deklarierte Komponenten eines Objekts ermöglichen eine ähnliche Abschirmung von Komponenten wie geschützte Datentypen.


Beispiel (Pascal++):
Interface-Teil des Moduls personal

  MODULE personal INTERFACE(OUTPUT);

  EXPORT personal = (person, einstellen, steigern, informieren);

  TYPE string20 = STRING(20);

       sperson = RECORD
                   name : string20;
                   vorname : string20;
                   pnr : INTEGER;
                   gehalt : REAL;
                 END;
     
       person = RESTRICTED sperson;

  FUNCTION einstellen(name: string20; vorname: string20) : person;
  PROCEDURE steigern(VAR p: sperson; betrag: REAL);
  PROCEDURE informieren(p: sperson);

  END.
Exportiert werden der geschützte Datentyp person und die Routinen einstellen, steigern, informieren zum Zugriff auf Daten vom Typ person.
Die

Implementationsteil des Moduls personal

  MODULE personal IMPLEMENTATION;

  CONST anfangsgehalt = 1000.0;

  VAR nr : INTEGER;

  FUNCTION einstellen; { (name: STRING; vorname: STRING) : person }
  VAR p : sperson;
  BEGIN
    p.name := name;
    p.vorname := vorname;
    p.pnr := nr;
    p.gehalt := anfangsgehalt;
    nr := nr + 1;
    einstellen := p;
  END;

  PROCEDURE steigern; { (VAR p: sperson; betrag: REAL) }
  VAR pp : sperson;
  BEGIN
    p.gehalt := p.gehalt + betrag;
  END;

  PROCEDURE informieren; { (p: sperson) }
  VAR pp : sperson;
  BEGIN
    WITH p DO
      Writeln(pnr:3, ' ', name:20, ' ', vorname:20, ' ', gehalt:10:2);
  END;

  TO BEGIN DO
    nr := 1;

  END.
Programm, welches Ressourcen des Moduls personal nutzt
  PROGRAM firma(OUTPUT);

  IMPORT personal;

  VAR p1, p2, p3 : person;

  BEGIN
    p1 := einstellen('Meier', 'Otto');
    informieren(p1);
    steigern(p1, 500.0);
    informieren(p1);
    p2 := einstellen('Mueller', 'Ottokar');
    informieren(p2);
    p3 := einstellen('Moeller', 'Ottilie');
    informieren(p3);
    steigern(p3, -500.0);
    informieren(p3);
  END.
Das Programm hat keinen direkten Zugriff auf die Komponenten der Datenstrukturen, d.h. Anweisungen wie p1.gehalt := 1500.0; führen zu einem Syntaxfehler.

Ergebnisprotokoll

  1                Meier                 Otto    1000.00
  1                Meier                 Otto    1500.00
  2              Mueller              Ottokar    1000.00
  3              Moeller              Ottilie    1000.00
  3              Moeller              Ottilie     500.00


P. Böhme, 17.08.1996