UML有序超集的子集问题:继承属性是否需保留有序性?
UML继承属性的有序性问题解答
问题背景
部分属性被定义为带有{ordered}约束的继承属性的子集,例如:RedefinableTemplateParameter::/inheritedParameter是TemplateSignature::parameter的子集(详见UML 2.5.1规范PDF第196页和第99页)。后者带有{ordered}约束,但该子集未被定义为有序。实际上,派生属性RedefinableTemplateSignature::/inheritedParameter的OCL实现如下:
inheritedParameter() : TemplateParameter [0..*] Derivation for RedefinableTemplateSignature::/inheritedParameter body: if extendedSignature->isEmpty() then Set{} else extendedSignature.parameter->asSet() endif
现问询:继承属性是否无需具备有序性?或者是否默认超集的顺序会延续到子集?
回答
继承属性不需要强制继承超集的有序性
从给出的OCL实现能直接看出来:代码里特意把带{ordered}约束的超集parameter通过->asSet()转换成了无序集合,最终返回的要么是空集合Set{},要么是转换后的无序集合。这说明UML规范并没有要求子集必须继承超集的有序约束,是否有序完全由派生属性的定义和具体实现来决定。超集的顺序不会默认延续到子集
如果规范意图让这个继承属性保留超集的顺序,那OCL实现里就不会用->asSet(),而是会用->asSequence()或者直接返回原有序集合。这里明确转成Set类型,就是在声明这个继承属性是无序的子集。
简单来说,继承属性的有序性是独立定义的,不会自动继承超集的有序约束,具体要看派生属性的OCL推导规则或者规范里的明确说明。
内容的提问来源于stack exchange,提问作者Robert Hairgrove
相关产品推荐
相关产品推荐

