Partager via


Héritage du modèle de type 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 de votre choix. Pour spécifier un modèle dont 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 explicitement déclarer qu’il est Virtuel. La directive Virtual 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 qui est ensuite hérité 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émas redondantes, les schémas ne sont pas émis pour les modèles dérivés d’un modèle qui a déjà un schéma. Cette restriction élimine plusieurs définitions du même type de données primitif qui résulteraient si plusieurs variantes d’un type de données primitif unique sont définies sans l’aide de l’héritage. La directive Virtual n’affecte pas si le schéma est émis. L’utilisateur moyen n’a pas besoin de comprendre les détails de l’émission d’un schéma. Le filtre de l’analyseur s’en charge automatiquement.

Liaison

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 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 les membres d’un modèle de construction. Un tel algorithme n’aurait pas de sens, car les valeurs n’ont aucun nom ou instance noms nécessaires pour implémenter une liaison indirecte.

Exemple

L’héritage des types 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
}