我想在“Comp”类的上下文中在 oclInEcore 编辑器中编写以下操作,该类应该将 Comp 对象的父对象收集到 Set。
operation parents(): Set(Comp)
{
body: self.superComp->union(self.parents());
}
问题是, ocl 不接受 Set(Comp) 作为返回类型。但是,它接受 Comp[*],但这最终会导致无效调用(由于返回类型不兼容,我想......)
我想在“Comp”类的上下文中在 oclInEcore 编辑器中编写以下操作,该类应该将 Comp 对象的父对象收集到 Set。
operation parents(): Set(Comp)
{
body: self.superComp->union(self.parents());
}
问题是, ocl 不接受 Set(Comp) 作为返回类型。但是,它接受 Comp[*],但这最终会导致无效调用(由于返回类型不兼容,我想......)
Set(Comp)
确实无效。在 OCLInEcore 中,指定返回类型的语法是不同的。问题是模型结构定义(类、特性、操作)与 OCL 本身无关。只有在您为不变量、派生特征或操作体定义实际逻辑时,它才会出现。
这样做的正确方法如下:
operation parents() : Comp[*] { <properties> derived }
是Comp
返回类型,[*]
设置upperBound
为 -1。这<properties>
是一个操作返回类型属性的列表,它将精确地指定应该使用哪个集合类。
以下是选项:
!unique ordered
-->Sequence(Comp)
!unique !ordered
-->Bag(Comp)
unique !ordered
-->Set(Comp)
unique ordered
-->OrderedSet(Comp)
例如:
operation parents() : Comp[*] { unique !ordered derived }
将导致Set(Comp)
.
我不知道 oclInEcore,但在基本 ecore 中,您可以定义一个 EDataType 并将其“实例类型名称”设置为您想要的 Java 返回类型,然后在您的 EOperation 上使用该数据类型。HTH。