OCL allInstances() 函数

OCL allInstances()

当时我学习了一点OCL,遇到了以下问题,我找不到正确的答案。我查看了 OCL 2.4 Spec 上的文档,但我什么也没找到,这似乎回答了我的问题:

主要是allInstances()实例使用如下:

context 人物 inv: Person.allInstances().forAll(p : Person | p.employeeNumber <> self.employeeNumber)

其中 Person 是具有属性 employeeNumber.

的 class

是否也允许在自身和其他属性上使用 allInstances(),并且具有相同的属性,例如 .allInstances() ?

您触及了 OCL 规范中较为模糊的区域之一。 allInstances() 是一种类型操作,因此可能被认为是静态的,但 static 关键字是在 OCL 2.2 中添加的,没有任何明确的语义或示例。

基于 Eclipse OCL Pivot 的实现原型解决了模糊性。 OclElement::allInstances() 在 /org.eclipse.ocl.pivot/model/OCL-2.5.oclstdlib 中建模为静态操作,因此源必须是类型。

如果您调用 self.allInstances(),您会得到“'Class' 而不是 'Object' 所需的值”。

如果你调用 self.oclType().allInstances() 你会得到更有趣的东西。

注意。实现 oclType() 以支持全反射是另一个规范说明。

如果你想要 OCL 实现之间的可移植性,坚持使用 Person.allInstances()->isUn​​ique(employeeNumber).