Héritage des modèles de types de données

Un modèle de type de données peut hériter des propriétés d’un modèle de type de données précédemment défini. Toutes les propriétés reconnues appropriées au modèle de base sont héritées. Les propriétés héritées ne peuvent pas être redéfinies dans le modèle dérivé.

Les modèles dérivés peuvent être hérités par d’autres modèles à n’importe quel niveau souhaité. Pour spécifier un modèle à hériter, nommez-le simplement à l’aide de la directive *Hérite. Le modèle de base doit être un modèle de type de données.

Les modèles qui servent de modèles de base n’ont pas besoin d’être complètement définis. La directive *Virtual : TRUE est utilisée pour informer l’analyseur qu’un modèle peut être partiellement défini. (Toutefois, le modèle le plus de base doit contenir la directive *DataType .) Le modèle dérivé peut ensuite terminer la définition du type de données. Si le modèle dérivé ne peut pas terminer la définition du type de données, il doit se déclarer explicitement comme étant virtuel. La directive virtuelle n’est pas héritée. Les modèles virtuels ne peuvent pas être référencés à l’aide des directives *ElementType ou *ValueType . Elles peuvent être référencées uniquement par le biais de la directive *Hérite .

Note Le filtre d’analyseur crée automatiquement une valeur par défaut pour la directive *ArraySize si elle est manquante lorsque la directive *ElementType est fournie dans un type de données COMPOSITE. Par conséquent, *ArraySize peut être défini avant *ElementType (en définissant *ArraySize dans un modèle hérité par la suite par le modèle qui définit *ElementType), mais l’inverse n’est pas autorisé (autrement dit, *ElementType ne peut pas être défini avant *ArraySize).

Schémas

Les schémas ne sont pas émis pour les modèles de type de données incomplets. Pour éviter les définitions de schéma redondantes, les schémas ne sont pas émis pour les modèles dérivés d’un modèle qui possède déjà un schéma. Cette restriction élimine plusieurs définitions du même type de données primitifs qui résulteraient si plusieurs variantes d’un seul type de données primitif sont définies sans l’aide de l’héritage. La directive virtuelle n’affecte pas si le schéma est émis. L’utilisateur moyen n’a pas besoin de comprendre les détails du moment où un schéma est émis. Le filtre d’analyseur s’occupe automatiquement de cela.

Reliure

Les propriétés définies ou héritées dans le modèle de base référencé par la directive *Inherits: sont directement héritées par le modèle dérivé. Lorsqu’un modèle dérivé ou de base est référencé par la directive *ElementType d’un autre modèle de type de données ou la directive *ValueType à partir d’un modèle d’attribut, le modèle nommé est lié. Il n’existe aucun algorithme de liaison complexe tel que utilisé pour lier des membres d’un modèle de construction. Un tel algorithme n’aurait pas de sens, car les valeurs n’ont pas de noms ou de noms d’instance nécessaires pour implémenter une liaison indirecte.

Exemple :

L’héritage de type de données est utilisé pour factoriser les propriétés communes à plusieurs modèles de type de données. Dans l’exemple suivant, les modèles de base définissent les propriétés communes à plusieurs types de données de tableau. Notez que deux niveaux d’héritage sont utilisés.

*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
}