9.3.3 语义
9.3.3.1 模板和绑定的分类符
术语【模板】和【绑定元素】的释义在7.3——模板中定义。
使用一个RedefinableTemplateSignature(可重定义的模板签名)来参数化的分类符被成为一个模板分类符,具有一个或多个模板绑定的分类符被成为一个绑定的分类符。
模板的一般化语义在子章节7.3.3中定义。但绑定元素的内容合并细节并未在那里阐述。在分类符场景下,该语义等同于插入一个代表每个绑定中间结果的匿名绑定分类符并用该绑定分类符特化所有的中间结果。
扩展绑定分类符的成员可以被用做绑定中的实际参数。
绑定分类符可以有来自绑定结果之外的内容。
模板分类符的参数可以是任意类型的模板参数。只有当参数是一个分类符、一个字面量规约、一个属性或一个操作时,它的语义和表示法才被定义。
当参数是一个由ClassifierTemplateParameter(分类符模板参数)所表示的分类符时,其语义和表示法在本章节进行定义。
当参数是一个字面量规约时,它的语义和表示法如同在7.3中所定义的一般。
当参数是一个操作时,其语义和表示法同9.6中所规定的一般。
当参数是一个属性时,其语义和表示法同9.5中所规定的一般。
9.3.3.2 模板分类符特化
可重定义的模板签名特化了模板签名(TemplateSignature)和可重定义元素(RedefinableElement)从而使得在一个特化模板分类符上下文中允许添加新的形式模板参数。
可重定义的模板签名重定义了所有是模板的父分类符的可重定义模板签名。扩展(重定义)的签名的所有形式模板参数做为扩展签名的形式模板签名被扩展签名所包含,连同扩展签名本身规定的其它模板参数。
9.3.3.3 分类符模板参数
分类符模板参数是一个模板参数,其中的参数化元素是一个分类符。
所有分类符的子类(例如类、协作、构件、数据类型、接口、信号和用例)可以被参数化、绑定和做为模板参数。做为类的子类,这同样适用于行为,而且行为的所有子类(例如活动、交互、状态机)。
分类符模板参数的constrainingClassifier属性规定了可用于约束该参数的实际参数的一组分类符。如果在该集合中有任何分类符,那么实参(argument)应该与它们是兼容的:
- 如果allowSubstitutable为假,那么该兼容性指的是constrainingClassifiers或者它们的一个特化。
- 如果allowSubstitutable为真,那么该兼容性还允许契约是一个constrainingClassifier的一个替换。
此外,如果存在constrainingClssifiers,那么参数化元素应该遵循如下约束:
- 如果allowSubstitutable为假,那么兼容性指的是constrainingClassifiers或者它们的一个直接特化,不能有额外的特征。
- 如果allowSubstitutable为真,那么兼容性还允许契约是一个constrainingClassifier的一个替换。
任何情形下,如果参数化元素不是抽象的,那么用做实参的分类符也不应该是抽象的。除此之外,如果constrainingClassifer属性为空,那么对实参没有分类符的约束。此时,参数化元素不应该有泛化和特征,并且allowSubstitutable应该为假。