Herança de modelo de tipo de dados
Um modelo de tipo de dados pode herdar propriedades de um modelo de tipo de dados definido anteriormente. Todas as propriedades reconhecidas apropriadas para o modelo base são herdadas. As propriedades herdadas não podem ser redefinidas no modelo derivado.
Modelos derivados podem ser herdados por outros modelos para qualquer nível desejado. Para especificar um modelo do qual herdar, basta nomeá-lo usando a diretiva *Inherits. O modelo base deve ser um modelo de tipo de dados.
Os modelos que servem como modelos base não precisam ser completamente definidos. A diretiva *Virtual: TRUE é usada para informar ao analisador que um modelo pode ser parcialmente definido. (No entanto, o modelo mais básico deve conter a diretiva *DataType .) Em seguida, o modelo derivado pode concluir a definição do tipo de dados. Se o modelo derivado não puder concluir a definição do tipo de dados, ele deverá declarar-se explicitamente como Virtual. A diretiva Virtual não é herdada. Os modelos virtuais não podem ser referenciados usando as diretivas *ElementType ou *ValueType . Eles só podem ser referenciados por meio da diretiva *Inherits .
Nota O filtro de analisador criará automaticamente um valor padrão para a diretiva *ArraySize se ela estiver ausente quando a diretiva *ElementType for fornecida em um tipo de dados COMPOSITE. Como resultado, *ArraySize pode ser definido antes de *ElementType (definindo *ArraySize em um modelo que é herdado posteriormente pelo modelo que define *ElementType), mas o inverso não é permitido (ou seja, *ElementType não pode ser definido antes de *ArraySize).
Esquemas
Esquemas não são emitidos para modelos de tipo de dados incompletos. Para evitar definições de esquema redundantes, os esquemas não são emitidos para modelos derivados de um modelo que já tem um esquema. Essa restrição elimina várias definições do mesmo tipo de dados primitivo que resultariam se várias variantes de um único tipo de dados primitivos fossem definidas sem o auxílio da herança. A diretiva Virtual não afeta se o esquema é emitido. O usuário médio não precisa entender os detalhes de quando um esquema é emitido. O filtro do analisador cuida disso automaticamente.
Associação
As propriedades definidas ou herdadas no modelo base referenciadas pela diretiva *Inherits: são herdadas diretamente pelo modelo derivado. Quando um modelo derivado ou base é referenciado pela diretiva *ElementType de outro modelo de tipo de dados ou pela diretiva *ValueType de um modelo de atributo, o modelo nomeado é associado. Não há nenhum algoritmo de associação complexo, como usado para associar membros de um modelo de construção. Esse algoritmo não faria sentido porque os valores não têm nomes ou nomes de instância necessários para implementar a associação indireta.
Exemplo
A herança de tipo de dados é usada para fatorar propriedades comuns a vários modelos de tipo de dados. No exemplo a seguir, os modelos base definem as propriedades que são comuns a vários tipos de dados de matriz. Observe que dois níveis de herança são usados.
*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
}