Strukturen
Viele Anwendungen bilden ihre Daten nicht als flache Liste ab, sondern als Baum: eine Organisation aus Bereichen und Einheiten, ein Mandant mit Untermandanten, ein Dokumentationsbaum aus Seiten. Für solche Bäume bringt das Modul tl.element zwei Basistypen mit, von denen eine eigene Struktur ableitet.
Die beiden Basistypen
tl.element:StructuredElement ist der Basistyp eines Knotens. Er trägt die Referenz parent auf den Knoten, der ihn enthält.
tl.element:StructuredElementContainer leitet selbst von StructuredElement ab und ergänzt die Referenz children auf die enthaltenen Knoten. Ein Container ist also immer auch ein Knoten und kann damit selbst in einem anderen Container liegen — daraus entsteht die Schachtelung.
Beide Referenzen sind abstrakt. Sie legen nur fest, dass es eine Eltern- und eine Kind-Beziehung gibt, nicht welche Typen darin auftreten dürfen. Genau deshalb muss jede Struktur sie redeklarieren.
Aufbau einer Struktur
Eine auf StructuredElement aufgebaute Struktur ist nach diesem Schema aufgebaut:
// Oberster Typ der Struktur - jeder Typ der Struktur leitet davon ab.
MyNode extends StructuredElement {
parent: MyContainer
}
// Abstrakter Typ für Knoten mit Unterstruktur.
abstract MyContainer extends MyNode, StructuredElementContainer {
}
// Konkrete Typen mit Kindern.
NodeA extends MyContainer {
children: ...
}
NodeB extends MyContainer {
children: ...
}
// Konkreter Typ ohne Kinder.
NodeC extends MyNode {
}
Drei Punkte sind daran wesentlich:
- Der oberste Typ redeklariert
parentund verengt die Referenz auf den Container-Typ der eigenen Struktur. Damit weiß jeder Knoten, in was für einem Container er liegen kann. - Jeder konkrete Typ mit Unterstruktur redeklariert
childrenund verengt die Referenz auf die Typen, die er enthalten darf. Über diese Verengung steuert das Modell, was der Nutzer unterhalb eines Knotens anlegen kann. - Ein Typ ohne Kinder leitet nur von
MyNodeab, nicht vonMyContainer. So entstehen Blätter, unter denen nichts angelegt werden kann.
Warum die Redeklaration nötig ist
Auf ein abstraktes Attribut kann nicht zugegriffen werden — weder lesend noch schreibend. Fehlt die Redeklaration, schlägt daher jeder Zugriff auf parent oder children mit einem Fehler fehl.
Frühere Versionen lieferten in diesem Fall stillschweigend null. Ein Modell, dem die Redeklaration fehlte, funktionierte dadurch scheinbar, verhielt sich aber an anderer Stelle unerklärlich. Seit TopLogic 8.0 wird der Fehler direkt gemeldet, damit die Inkonsistenz im Modell erkennbar wird.