データ型テンプレート継承
データ型テンプレートは、以前に定義したデータ型テンプレートからプロパティを継承できます。 基本テンプレートに適した認識されたすべてのプロパティが継承されます。 継承されたプロパティは、派生テンプレートでは再定義できません。
派生テンプレートは、他のテンプレートから任意のレベルに継承できます。 継承するテンプレートを指定するには、*Inherits ディレクティブを使用して名前を付けます。 基本テンプレートはデータ型テンプレートである必要があります。
基本テンプレートとして機能するテンプレートを完全に定義する必要はありません。 *Virtual: TRUE ディレクティブは、テンプレートを部分的に定義できることをパーサーに通知するために使用されます。 (ただし、最も基本となるテンプレートには *DataType ディレクティブが含まれている必要があります)。その後、派生テンプレートでデータ型の定義を完了できます。 派生テンプレートがデータ型の定義を完了できない場合は、それ自体を Virtual として明示的に宣言する必要があります。 Virtual ディレクティブは継承されません。 *ElementType ディレクティブまたは *ValueType ディレクティブを使用して仮想テンプレートを参照することはできません。 これらは、*Inherits ディレクティブを介してのみ参照できます。
注:*ElementType ディレクティブが COMPOSITE データ型で指定されている場合、パーサー フィルターによって *ArraySize ディレクティブの既定値が自動的に作成されます。 その結果、*ArraySize は *ElementType より前に定義できますが (後で *ElementType を定義するテンプレートによって継承されるテンプレートで *ArraySize を定義することによって)、逆の処理は許可されません (つまり、*ElementType を *ArraySize の前に定義することはできません)。
スキーマ
スキーマは、不完全なデータ型テンプレートには出力されません。 冗長なスキーマ定義を回避するために、スキーマが既に存在するテンプレートから派生したテンプレートのスキーマは生成されません。 この制限により、同じプリミティブ データ型の複数の定義が削除され、1 つのプリミティブ データ型の複数のバリアントが継承なしで定義された場合に発生します。 Virtual ディレクティブは、スキーマが出力されるかどうかには影響しません。 平均的なユーザーは、スキーマが出力されるタイミングの詳細を把握する必要はありません。 パーサー フィルターでは、この処理が自動的に行われます。
バインド
*Inheritsにより参照される基本テンプレートで定義または継承されるプロパティ:派生テンプレートによって直接継承されます。 派生テンプレートまたは基本テンプレートが、別のデータ型テンプレートの *ElementType ディレクティブまたは属性テンプレートの *ValueType ディレクティブによって参照されている場合、名前付きテンプレートはバインドされます。 コンストラクト テンプレートのメンバーをバインドするために使用されるなどの複雑なバインド アルゴリズムはありません。 このようなアルゴリズムは、値に間接バインディングを実装するために必要な名前やインスタンス名がないため意味はありません。
例
データ型の継承は、複数のデータ型テンプレートに共通するプロパティを除外するために使用されます。 次の例では、基本テンプレートによって、複数の配列データ型に共通するプロパティが定義されています。 2 つのレベルの継承が使用されることに留意してください。
*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
}