資料類型範本繼承
資料類型範本可以從先前定義的資料類型範本繼承屬性。 所有適合基底範本的已辨識屬性都會繼承。 繼承的屬性無法在衍生範本中重新定義。
衍生範本可由其他範本繼承至您想要的任何層級。 若要指定要繼承的範本,只要使用 *Inherits 指示詞加以命名即可。 基底範本必須是資料類型範本。
作為基底範本的範本不需要完全定義。 *Virtual: TRUE 指示詞是用來通知剖析器可以部分定義範本。 不過, (基底範本必須包含 *DataType 指示詞。) 衍生的範本接著可以完成資料類型的定義。 如果衍生的範本無法完成資料類型的定義,則必須明確地將本身宣告為 Virtual。 虛擬指示詞不會繼承。 無法使用 *ElementType 或 *ValueType 指示詞來參考虛擬範本。 它們只能透過 *Inherits 指示詞來參考。
注意剖析器篩選準則會在複合資料型別中提供*ElementType指示詞時,自動建立*ArraySize指示詞的預設值。 因此,*ArraySize可以在*ElementType (之前定義,方法是在定義*ElementType) 的範本中定義*ArraySize,但不允許反向 (定義*ArraySize) 。
結構描述
架構不會針對不完整的資料類型範本發出。 為了避免備援架構定義,不會針對衍生自已有架構之範本的範本發出架構。 這項限制會消除相同基本資料類型的多個定義,如果定義單一基本資料類型的多個變體,而不需要繼承的協助,就會造成這種定義。 Virtual指示詞不會影響是否發出架構。 平均使用者不需要瞭解發出架構時的詳細資料。 剖析器篩選會自動處理此動作。
繫結
在 *Inherits:指示詞所參考之基底範本中定義或繼承的屬性會由衍生範本直接繼承。 當衍生或基底範本由 *ElementType 指示詞從另一個資料類型範本或屬性範本的 *ValueType 指示詞參考時,具名範本會系結。 沒有複雜的系結演算法,例如用來系結建構範本的成員。 這類演算法不合理,因為值沒有實作間接系結所需的名稱或實例名稱。
範例
資料類型繼承是用來分解數個資料類型範本通用的屬性。 在下列範例中,基底範本會定義數個數組資料類型通用的屬性。 請注意,會使用兩個層級的繼承。
*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
}