OCL allInstances()

时间:2018-05-09 13:46:45

标签: ocl

在我学习OCL时,我遇到了以下问题,我找不到合适的答案。我查看了OCL 2.4 Spec上的文档,但我一无所获,似乎回答了我的问题:

主要使用 allInstances()示例如下:

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

其中 Person 是一个具有 employeeNumber 属性的类。

是否也允许在自身和其他属性上使用 allInstances(),并且具有相同的功能,例如&lt; Type&gt; .allInstances()?< / p>

1 个答案:

答案 0 :(得分:0)

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

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

如果您调用self.allInstances(),您将获得&#34;&#39; Class&#39;而不是&#39;对象&#39;所需的价值&#34;。

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

NB。实现oclType()以支持完全反射是另一个规范澄清。

如果您希望OCL实现之间的可移植性坚持像Person.allInstances() - &gt; isUnique(employeeNumber)。