Condividi tramite


Ereditarietà del modello del tipo di dati

Un modello di tipo di dati può ereditare le proprietà da un modello di tipo di dati definito in precedenza. Tutte le proprietà riconosciute appropriate per il modello di base vengono ereditate. Impossibile ridefinire le proprietà ereditate nel modello derivato.

I modelli derivati possono essere ereditati da altri modelli a qualsiasi livello desiderato. Per specificare un modello da cui ereditare, è sufficiente denominarlo usando la direttiva *Inherits. Il modello di base deve essere un modello di tipo di dati.

I modelli che fungono da modelli di base non devono essere completamente definiti. La direttiva *Virtual: TRUE viene usata per informare il parser che un modello può essere definito parzialmente. Il modello di base deve tuttavia contenere la direttiva *DataType . Il modello derivato può quindi completare la definizione del tipo di dati. Se il modello derivato non può completare la definizione del tipo di dati, deve dichiararsi esplicitamente virtuale. La direttiva Virtual non viene ereditata. Non è possibile fare riferimento ai modelli virtuali usando le direttive *ElementType o *ValueType . È possibile farvi riferimento solo tramite la direttiva *Inherits .

Nota Il filtro parser crea automaticamente un valore predefinito per la direttiva *ArraySize se manca quando la direttiva *ElementType viene fornita in un tipo di dati COMPOSITE. Di conseguenza, *ArraySize può essere definito prima di *ElementType (definendo *ArraySize in un modello ereditato successivamente dal modello che definisce *ElementType), ma il contrario non è consentito (ovvero *ElementType non può essere definito prima di *ArraySize).

Schemi

Gli schemi non vengono generati per modelli di tipo di dati incompleti. Per evitare definizioni di schema ridondanti, gli schemi non vengono generati per i modelli derivati da un modello che dispone già di uno schema. Questa restrizione elimina più definizioni dello stesso tipo di dati primitivo che determinerebbero se più varianti di un singolo tipo di dati primitivo vengono definite senza l'ausilio dell'ereditarietà. La direttiva Virtual non influisce sul fatto che lo schema venga generato. L'utente medio non deve comprendere i dettagli di quando viene generato uno schema. Il filtro del parser si occupa automaticamente di questa operazione.

Binding

Le proprietà definite o ereditate nel modello di base a cui fa riferimento la direttiva *Inherits: vengono ereditate direttamente dal modello derivato. Quando si fa riferimento a un modello derivato o di base dalla direttiva *ElementType da un altro modello di tipo di dati o dalla direttiva *ValueType da un modello di attributo, il modello denominato è associato. Non esiste un algoritmo di associazione complesso, ad esempio usato per associare i membri di un modello di costrutto. Un algoritmo di questo tipo non avrebbe senso perché i valori non hanno nomi o nomi di istanza necessari per implementare l'associazione indiretta.

Esempio

L'ereditarietà dei tipi di dati viene usata per escludere le proprietà comuni a diversi modelli di tipo di dati. Nell'esempio seguente i modelli di base definiscono le proprietà comuni a diversi tipi di dati di matrice. Si noti che vengono usati due livelli di ereditarietà.

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