在我学习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>
答案 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)。