数据类型模板继承
数据类型模板可以从以前定义的数据类型模板继承属性。 将继承适用于基本模板的所有已识别属性。 无法在派生模板中重新定义继承的属性。
派生模板可由其他模板继承到所需的任何级别。 若要指定要从其继承的模板,只需使用 *Inherits 指令对其进行命名。 基模板必须是数据类型模板。
无需完全定义用作基本模板的模板。 *Virtual: TRUE 指令用于通知分析程序可以部分定义模板。 (最基础模板必须包含 *DataType 指令。) 派生模板随后可以完成数据类型的定义。 如果派生模板无法完成数据类型的定义,则必须将自身显式声明为 Virtual。 不继承 Virtual 指令。 不能使用 *ElementType 或 *ValueType 指令引用虚拟模板。 只能通过 *Inherits 指令引用它们。
注意如果在 COMPOSITE 数据类型中提供 *ElementType 指令时缺失 ,分析程序筛选器会自动为 *ArraySize 指令创建默认值。 因此,可以在 *ElementType (之前定义 ArraySize,方法是在随后由定义 *ElementType) 的模板继承的模板中定义 *ArraySize,但不允许反向定义, (即,无法在 *ArraySize) 之前定义 *ElementType。
架构
不会为不完整的数据类型模板发出架构。 为了避免冗余架构定义,不会为派生自已有架构的模板的模板发出架构。 此限制消除了同一基元数据类型的多个定义,如果在没有继承帮助的情况下定义单个基元数据类型的多个变体,则会导致这些定义。 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
}