Herencia de plantillas de tipo de datos
Una plantilla de tipo de datos puede heredar propiedades de una plantilla de tipo de datos definida previamente. Se heredan todas las propiedades reconocidas que son adecuadas para la plantilla base. Las propiedades heredadas no se pueden redefinir en la plantilla derivada.
Otras plantillas derivadas pueden heredar otras plantillas a cualquier nivel que desee. Para especificar una plantilla de la que se va a heredar, simplemente asígnelo mediante la directiva *Inherits. La plantilla base debe ser una plantilla de tipo de datos.
Las plantillas que sirven como plantillas base no necesitan definirse completamente. La directiva *Virtual: TRUE se usa para informar al analizador de que una plantilla se puede definir parcialmente. (Sin embargo, la plantilla de base más debe contener la directiva *DataType ). Después, la plantilla derivada puede completar la definición del tipo de datos. Si la plantilla derivada no puede completar la definición del tipo de datos, debe declararse explícitamente como Virtual. La directiva Virtual no se hereda. No se puede hacer referencia a las plantillas virtuales mediante las directivas *ElementType o *ValueType . Solo se puede hacer referencia a ellos a través de la directiva *Inherits .
Nota El filtro del analizador crea automáticamente un valor predeterminado para la directiva *ArraySize si falta cuando se proporciona la directiva *ElementType en un tipo de datos COMPOSITE. Como resultado, *ArraySize se puede definir antes de *ElementType (definiendo *ArraySize en una plantilla que posteriormente hereda la plantilla que define *ElementType), pero no se permite la inversa (es decir, *ElementType no se puede definir antes de *ArraySize).
Esquemas
Los esquemas no se emiten para plantillas de tipo de datos incompletas. Para evitar definiciones de esquema redundantes, no se emiten esquemas para plantillas derivadas de una plantilla que ya tiene un esquema. Esta restricción elimina varias definiciones del mismo tipo de datos primitivo que daría lugar si se definen varias variantes de un único tipo de datos primitivo sin la ayuda de herencia. La directiva Virtual no afecta a si se emite el esquema. El usuario medio no necesita comprender los detalles de cuándo se emite un esquema. El filtro del analizador se encarga de esto automáticamente.
Enlace
Las propiedades definidas o heredadas en la plantilla base a las que hace referencia la directiva *Inherits: son heredadas directamente por la plantilla derivada. Cuando se hace referencia a una plantilla derivada o base mediante la directiva *ElementType de otra plantilla de tipo de datos o la directiva *ValueType de una plantilla de atributo, la plantilla con nombre está enlazada. No hay ningún algoritmo de enlace complejo, como se usa para enlazar miembros de una plantilla de construcción. Este algoritmo no tendría sentido porque los valores no tienen nombres ni nombres de instancia necesarios para implementar el enlace indirecto.
Ejemplo
La herencia de tipos de datos se usa para factorizar las propiedades que son comunes a varias plantillas de tipo de datos. En el ejemplo siguiente, las plantillas base definen las propiedades que son comunes a varios tipos de datos de matriz. Tenga en cuenta que se usan dos niveles de herencia.
*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
}