UML 2.5.1中Classifier::inheritedMember()的OCL关键字self指代疑问
UML 2.5.1规范定义(第176页)
分类器(9.9.4.7节“操作”): • inheritedMember() : 命名元素 [0..*] inheritedMember关联是通过继承父类的可继承成员推导而来的。 body: inherit(parents()->collect(inheritableMembers(self))->asSet()) ^^^^
问题
请问OCL关键字self是指代parents()集合中的元素,还是定义inheritedMember()操作的分类器?根据文本描述,我认为它应该是parents()集合中的元素,但对此并不确定,另一种选项在我看来并不合理。
解答
self在这里指代的是定义inheritedMember()操作的分类器实例,而非parents()集合中的元素。
原因如下:
- 按OCL基础语义,在类操作的body表达式里,
self默认指向执行该操作的当前对象实例,也就是拥有这个inheritedMember()操作的分类器本身。 - 结合规范逻辑:
inheritedMember是当前分类器从父类继承的成员,parents()->collect(inheritableMembers(self))的意思是遍历当前分类器的所有父类,收集每个父类中对当前分类器(self)而言可被继承的成员——父类成员能否被子类继承,需要基于子类上下文判断,这里的self就是要继承成员的子类(定义该操作的分类器)。
你之前的理解有误,看似不合理的选项才是正确的。
内容的提问来源于stack exchange,提问作者Robert Hairgrove
相关产品推荐
相关产品推荐

