Vererbung von Datentypvorlagen
Eine Datentypvorlage kann Eigenschaften von einer zuvor definierten Datentypvorlage erben. Alle erkannten Eigenschaften, die für die Basisvorlage geeignet sind, werden geerbt. Geerbte Eigenschaften können in der abgeleiteten Vorlage nicht neu definiert werden.
Abgeleitete Vorlagen können von anderen Vorlagen auf jede gewünschte Ebene vererbt werden. Um eine Vorlage anzugeben, von der geerbt werden soll, benennen Sie sie einfach mithilfe der *Inherits-Direktive. Die Basisvorlage muss eine Datentypvorlage sein.
Die Vorlagen, die als Basisvorlagen dienen, müssen nicht vollständig definiert werden. Die *Virtual: TRUE-Anweisung wird verwendet, um den Parser darüber zu informieren, dass eine Vorlage teilweise definiert werden kann. (Die Basisvorlage muss jedoch die *DataType-Direktive enthalten.) Die abgeleitete Vorlage kann dann die Definition des Datentyps abschließen. Wenn die abgeleitete Vorlage die Definition des Datentyps nicht abschließen kann, muss sie sich selbst explizit als virtual deklarieren. Die virtuelle Direktive wird nicht geerbt. Auf virtuelle Vorlagen kann nicht mithilfe der *ElementType- oder *ValueType-Direktive verwiesen werden. Auf sie kann nur über die *Inherits-Direktive verwiesen werden.
Hinweis Der Parserfilter erstellt automatisch einen Standardwert für die *ArraySize-Direktive , wenn er fehlt, wenn die *ElementType-Direktive in einem COMPOSITE-Datentyp bereitgestellt wird. Daher kann *ArraySize vor *ElementType definiert werden (durch Definieren von *ArraySize in einer Vorlage, die anschließend von der Vorlage geerbt wird, die *ElementType definiert), aber das Umgekehrte ist nicht zulässig (das heißt, *ElementType kann nicht vor *ArraySize definiert werden).
Schemas
Schemas werden für unvollständige Datentypvorlagen nicht ausgegeben. Um redundante Schemadefinitionen zu vermeiden, werden Schemas nicht für Vorlagen ausgegeben, die von einer Vorlage abgeleitet sind, die bereits über ein Schema verfügt. Diese Einschränkung beseitigt mehrere Definitionen desselben primitiven Datentyps, die sich ergeben würden, wenn mehrere Varianten eines einzelnen primitiven Datentyps ohne Vererbung definiert werden. Die virtuelle Anweisung hat keinen Einfluss darauf, ob das Schema ausgegeben wird. Der durchschnittliche Benutzer muss sich nicht mit den Details vertraut machen, wann ein Schema ausgegeben wird. Der Parserfilter übernimmt dies automatisch.
Bindung
Die Eigenschaften, die in der Basisvorlage definiert oder geerbt werden, auf die die *Inherits:- Direktive verweist, werden direkt von der abgeleiteten Vorlage geerbt. Wenn die *ElementType-Direktive aus einer anderen Datentypvorlage oder die *ValueType-Direktive aus einer Attributvorlage auf eine abgeleitete Vorlage oder eine Basisvorlage verweist, wird die benannte Vorlage gebunden. Es gibt keinen komplexen Bindungsalgorithmus, der zum Binden von Elementen einer Konstruktvorlage verwendet wird. Ein solcher Algorithmus wäre nicht sinnvoll, da die Werte keine Namen oder instance Namen aufweisen, die für die Implementierung einer indirekten Bindung erforderlich sind.
Beispiel
Die Datentypvererbung wird verwendet, um Eigenschaften zu berücksichtigen, die für mehrere Datentypvorlagen üblich sind. Im folgenden Beispiel definieren Basisvorlagen die Eigenschaften, die für mehrere Arraydatentypen gemeinsam sind. Beachten Sie, dass zwei Vererbungsebenen verwendet werden.
*Template: GENERIC_ARRAY *% Basemost Template
{
*Type: DATATYPE
*Virtual: TRUE
*DataType: ARRAY
*RequiredDelimiter: ","
*OptionalDelimiter: "<20 09>"
}
*Template: LIST_OF_TYPE *% first level derived Template
{
*Inherits: GENERIC_ARRAY
*ArrayLabel: "LIST"
*ArraySize: [*]
*Virtual: TRUE
}
*Template: DT_INT_ARRAY *% first level derived Template
{
*Inherits: GENERIC_ARRAY
*ElementType: INTEGER
*Virtual: TRUE
}
*% ===================
*% Second-level templates derived from LIST_OF_TYPE
*% ===================
*Template: COLORS_LIST
{
*Inherits: LIST_OF_TYPE
*ElementType: COLORS
*ElementTags: (colors)
}
*Template: STD_VAR_LIST
{
*Inherits: LIST_OF_TYPE
*ElementType: STD_VAR
*ElementTags: (Standard_Variable)
}
*% ===================
*% Second-level templates derived from DT_INT_ARRAY
*% ===================
*Template: DT_POINT
{
*Inherits: DT_INT_ARRAY
*ArrayLabel: "POINT"
*ElementTags: (X_pos, Y_pos)
*ArraySize: 2
}
*Template: DT_PAIR_OF_INTS
{
*Inherits: DT_INT_ARRAY
*ArrayLabel: "PAIR"
*ElementTags: (width, height)
*ArraySize: 2
}
*Template: RECTANGLE
{
*Inherits: DT_INT_ARRAY
*ArrayLabel: "rect"
*ElementTags: (left, top, right, bottom)
*ArraySize: 4
}