Auf der anderen Seite stehen die Graphen ( G_graph), die bei ihrer Initialisierung mit einem Typsystem verbunden werden. Sie enthalten beliebig vielen Knoten ( G_vertex) und Kanten ( G_edge). Beim Erzeugen eines neuen Graphelementes muß ihm ein Typ aus dem Typsystem zugewiesen werden und es werden Werte ( G_valueRef) angelegt, die dem Attributierungsschema des Typs entsprechen.
Die Wertebereiche ( G_domain) werden im Wertebereichssystem verwaltet, welches im Programm global verfügbar ist. Sie sind entweder elementare Wertebereiche ( Basiswertebereiche), oder sie werden mit Wertebereichskonstruktoren erzeugt ( komplexe Wertebereiche). Diese Zusammenhänge sind in Abbildung dargestellt. Dieses Diagramm stellt nicht die interne Implementation dar. Es soll nur die Zusammenhänge zwischen den Wertebereichen und ihren Operationen verdeutlichen. Die gestrichelt gezeichneten Klassen symbolisieren Klassen, die nur intern benutzt werden. Als Schnittstelle zu Anwendungen dient nur die Klasse G_domain. Wenn eine Operation aufgerufen wird, die in der Unterklasse nicht definiert ist, dann erzeugt sie eine Fehlermeldung.
Als elementare Wertebereiche sind BOOL, INT,
STRING und DOUBLE vordefiniert. Sie sind über
Klassenvariablen der Klasse G_domain erreichbar.
Diese Wertebereiche bilden die Basis für die konstruierten
Wertebereiche. Mit der Operation newList()
kann ein Listenwertebereich erzeugt werden, der über einem
vorhandenen Wertebereich definiert ist. Die Operationen
newTuple() und
newRecord() erzeugen neue Tupel- bzw.
Recordwertebereiche. Dabei muß eine Folge von Wertebereichen bzw.
eine Zuordnung von Selektorbezeichnern zu Wertebereichen angegeben
werden. Aufzählungswertebereiche werden mit
newEnum() erzeugt und benötigen eine
Liste der Aufzählungskonstanten. Diese Konstruktoroperationen sind
als Klassenmethoden der Klasse G_domain
implementiert.
Die Welt der Werte im Graphenlabor ist analog zu den Wertebereichen realisiert. In Abbildung sind die Zusammenhänge unter den Werten dargestellt, wobei interne Klassen wieder gestrichelt sind. Auf einen Attributwert eines Knotens oder einer Kante kann man über die Operationen getVAttr() und getEAttr() der Klasse G_graph (siehe Abb.) zugreifen. Dabei erhält man eine Instanz der Klasse G_valueRef. Diese enthält neben einem Zeiger auf den Speicherbereich, an dem der Wert abgelegt ist, auch die Beschreibung des zugrundeliegenden Wertebereiches. Der angegebene Speicherbereich kann nur mit Kenntnis des Wertebereichs interpretiert werden.
Die Klasse G_valueRef ist wiederum eine abstrakte
Oberklasse. Werte von elementaren Wertebereichen
können mit den updateXXX()-Operationen gesetzt und mit den
getXXX()-Operationen abgefragt werden. Bei konstruierten
Wertebereichen werden über entsprechende Operationen einzelne
Komponenten aus den komplexen Werten ausgewählt. Dabei werden
wiederum Instanzen der Klasse G_valueRef erzeugt, die
auf Komponenten in den komplexen Werten verweisen.