Поделиться через


Наследование шаблона типа данных

Шаблон типа данных может наследовать свойства от ранее определенного шаблона типа данных. Все распознанные свойства, соответствующие базовому шаблону, наследуются. Унаследованные свойства нельзя переопределять в производном шаблоне.

Производные шаблоны могут наследоваться другими шаблонами на любом нужном уровне. Чтобы указать шаблон для наследования, просто назовите его с помощью директивы *Inherits. Базовый шаблон должен быть шаблоном типа данных.

Шаблоны, которые служат в качестве базовых шаблонов, не нужно полностью определять. Директива *Virtual: TRUE используется для информирования средства синтаксического анализа о том, что шаблон может быть частично определен. (Однако базовый шаблон должен содержать директиву *DataType .) Затем производный шаблон может завершить определение типа данных. Если производный шаблон не может завершить определение типа данных, он должен явно объявить себя как Virtual. Директива Virtual не наследуется. На виртуальные шаблоны нельзя ссылаться с помощью директив *ElementType или *ValueType . На них можно ссылаться только с помощью директивы *Inherits .

Примечание Фильтр синтаксического анализа автоматически создает значение по умолчанию для директивы *ArraySize , если оно отсутствует при указании директивы *ElementType в типе данных COMPOSITE. В результате *ArraySize можно определить до *ElementType (путем определения *ArraySize в шаблоне, который впоследствии наследуется шаблоном, определяющим *ElementType), но обратное не допускается (т. е. *ElementType не может быть определено до *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
}