13.2 用于元建模的OCL适配
我们在下面提供了一组规则和惯例用来从OCL(由UML超结构)定义BasicOCL——在本子章节称为“完整OCL”。
在完整OCL中定义的如下元类不是BasicOCL(和EssentialOCL)的一部分:
- MessageType
- ElementType
- AssociationClassCallExp
- MessageExp
- StateExp
- UnspecifiedValueExp
为这些类定义的任意良构规则也因此不是Basic OCL定义的一部分。因为在此上下文中属性NavigationCallExp::qualifier 和NavigationCallExp::navigationSource不再有用,所以它们被抑制。
- Core::Basic并不包含分类符的中继概念而是直接使用类型概念做为类型系统的基类。因此,在完整OCL规范中,任意到分类符类的引用都必须做为到类型类的引用进行重新解释。
- 如下操作不是Essential OCL的一部分:
- @pre
- ^
- ^^
如下名称在Essential OCL中不是保留字或限制字:
- OclMessage
- body
- context
- def
- derive
- endpackage
- init
- inv
- package
- post
- pre
- static
注意-期望本规范的未来版本可以提供显式的完整的良构规则集合和应用于Core::Basic的其它操作——从而替换我们这里使用的懒惰的再解释声明。
在完全OCL中,TupleType以DataType为基类型。在BasicOCL中,Tuple也以Class为机类型,因此元组的属性可以像在完整OCL那样中被定义——做为属性实例。
在完整OCL中,预定义的类型具有在标准库中预定义的操作。然而,Core::Basic中的数据类型不能定义类似的操作,因为它从类型继承(而不是从类)。对于所有的数据类型和特殊类型——像VoidType, InvalidType和AnyType——使用如下的惯例:在标准库中,代表预定义类型的实例都与持有该操作的同名类实例相关联。对预定义类型的操作的访问蕴含这对相关联类实例的该操作的访问。
EMOF自省功能没有被合并到元模型。AnyType发挥着Object的作用。在实例层,自省由oclIsKindOf(), oclIsTypeOf()和oclType()等操作来提供。