Nun werden wir uns darauf vorbereiten, die OT/OB-Lib zur Erstellung eigener Speicherobjekttypen zu verwenden. Speicherobjekte waren Objekte, die dazu dienen, bestimmte Information - wie auch immer - zu sichern. Sie ändern ihren äußeren Zustand nicht selbständig, sondern nur auf Befehl.
Der Unterschied, der zwischen Variable und Objekt gemacht wurde, soll noch einmal verdeutlicht werden:
Eine Variable hat jederzeit genau einen konkreten Wert. Unter Umständen kann man diesen Wert beeinflussen. Ein Objekt hingegen hat nach außen hin verschiedene Attribute, die abstrakten Attribute. Hierbei handelt es sich also um verschiedene Werte. Diese Attribute kann man ebenfalls unter Umständen beeinflussen.
Es wurde erwähnt, daß der Variablentyp eine Bezeichnung für den Wertebereich von Variablen ist. Mit dem Begriff WORD verbindet man daher eine Stelle, die Werte zwischen -32768 und 32767 annehmen kann. Analog dazu ist der Objekttyp eine Bezeichnung für die Spezifikation des Objektes. Mit dem Begriff myword wurden eben beispielsweise Objekte verbunden, wie sie in dem vorangegangen Kapitel beschrieben wurden: WORD-Variablen mit Zugriffszähler.
Unter dem Objekttyp "Videokassette" könnte man daher alle Objekte zusammenfassen, die der folgenden Spezifikation genügen:
Um Objekte diesen Typs im Programm nutzen zu können, muß einmal diese allgemeine Spezifikation umgesetzt werden.
Dazu wird die Implementation dieses Objekttyps in gewisse Teile unterteilt. Zur Beschreibung einer konkreten Implementation eines allgemeinen Speicherobjektes muß Folgendes angegeben werden:
Hierzu kann man in etwa nach dem folgenden Schema vorgehen (zur Verdeutlichung wird das Beispiel in einer Pseudoprogrammiersprache mitvollzogen):
TYPE videokassette
STRING titel ZAHL gesamtspielzeit LISTE(FILM) filmliste
EXPORT PROCEDURE new(ZAHL gesamtspielzeit) ' Gesamtspielzeit einmalig festsetzen LET videokassette.gesamtspielzeit=gesamtspielzeit RETURN EXPORT PROCEDURE free RETURN
EXPORT FUNCTION title RETURN videokassette.title ENDFUNC EXPORT FUNCTION film_get(ZAHL filmnummer) RETURN videokassette.filmliste.get(filmnummer) ENDFUNC EXPORT FUNCTION restspielzeit RETURN videokassette.gesamtspielzeit - videokassette.bespieltezeit ENDFUNC
EXPORT PROCEDURE title_set(STRING title) LET videokassette.title=title RETURN EXPORT PROCEDURE film_add(FILM new_film) @videokassette.filmliste.add(new_film) RETURN
FUNCTION bespieltezeit ZAHL summe ZAHL filmanzahl ZAHL film summe := 0 filmanzahl := videokassette.filmliste.elementanzahl FOR film := 1 TO filmanzahl summe := summe + videokassette.film_get(film).spielzeit NEXT film RETURN summe ENDFUNC ENDTYPE
So sähe das Ganze dann am Stück aus:
TYPE videokassette STRING titel ZAHL gesamtspielzeit LISTE(FILM) filmliste EXPORT PROCEDURE new(ZAHL gesamtspielzeit) ' Gesamtspielzeit einmalig festsetzen LET videokassette.gesamtspielzeit=gesamtspielzeit RETURN EXPORT PROCEDURE free RETURN EXPORT FUNCTION title RETURN videokassette.title ENDFUNC EXPORT FUNCTION film_get(ZAHL filmnummer) RETURN videokassette.filmliste.get(filmnummer) ENDFUNC EXPORT FUNCTION restspielzeit RETURN videokassette.gesamtspielzeit - videokassette.bespieltezeit ENDFUNC EXPORT PROCEDURE title_set(STRING title) LET videokassette.title=title RETURN EXPORT PROCEDURE film_add(FILM new_film) @videokassette.filmliste.add(new_film) RETURN FUNCTION bespieltezeit ZAHL summe ZAHL filmanzahl ZAHL film summe := 0 filmanzahl := videokassette.filmliste.elementanzahl FOR film := 1 TO filmanzahl summe := summe + videokassette.film_get(film).spielzeit NEXT film RETURN summe ENDFUNC ENDTYPE
Einmal so definiert, können Objekte diesen Typs angelegt und gelöscht werden. Ferner kann man die abstrakten Attribute benutzen. Man arbeitet dann mit den Objekten vom Typ VIDEOKASSETTE ganz analog wie oben mit ZAHL, STRING und FILM. Ein Bsp.:
VIDEOKASSETTE kassette_1(240) ! 240 min VIDEOKASSETTE kassette_2(240) ! 240 min VIDEOKASSETTE kassette_3(180) ! 180 min FILM nackte_kanone_1("Die nackte Kanone",112) FILM nackte_kanone_2.5("Die nackte Kanone 2 1/2",129) FILM nackte_kanone_33.3("Die nackte Kanone 33 1/3",104) AUSGABE(AUSGABE.SCREEN) bildschirm ' kassette_1.title_set("Nackte Kanone") kassette_1.film_add(nackte_kanone_1) kassette_1.film_add(nackte_kanone_2.5) kassette_1.film_add(nackte_kanone_33.3) ' bildschirm.ausgabe(kassette_1.restspielzeit)