You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于UML 2.5.1中Classifier::directlyUsedInterfaces()的OCL实现疑问

UML 2.5.1中Classifier::directlyUsedInterfaces()的实现修正方案

问题背景

在UML 2.5.1规范第177页的Classifier类9.9.47“Operations”章节中,directlyRealizedInterfaces()操作的定义和实现是有效的:

directlyRealizedInterfaces() : Interface [0..*]
The Interfaces directly realized by this Classifier

body: (clientDependency->select(
           oclIsKindOf(Realization) 
       and supplier->forAll(oclIsKindOf(Interface))))->
           collect(supplier.oclAsType(Interface))->asSet()

该操作可以正常实现(比如在C++中),因为Classifier的基类NamedElement定义了clientDependency属性,能直接获取以当前Classifier为client的依赖关系。

但同章节的directlyUsedInterfaces()操作存在实现问题:

directlyUsedInterfaces() : Interface [0..*]
The Interfaces directly used by this Classifier

body: (supplierDependency->select(
           oclIsKindOf(Usage) 
       and client->forAll(oclIsKindOf(Interface))))->
           collect(client.oclAsType(Interface))->asSet()

问题在于NamedElement中并不存在supplierDependency属性,推测这是规范旧版本遗留的定义。

可行的修正方案

完全可以仿照NamedElement::clientDependency()的实现逻辑,将其中的client替换为supplier来实现directlyUsedInterfaces()。

修正后的OCL实现如下:

directlyUsedInterfaces() : Interface [0..*]
The Interfaces directly used by this Classifier

body: (Dependency.allInstances()->select(d | 
           d.supplier->includes(self) 
       and d.oclIsKindOf(Usage) 
       and d.client->forAll(oclIsKindOf(Interface))))->
           collect(client.oclAsType(Interface))->asSet()

这个实现的逻辑是:遍历所有Dependency实例,筛选出以当前Classifier为supplier、类型为Usage,且所有client都是Interface的依赖,最后收集这些依赖中的Interface并去重,完全符合directlyUsedInterfaces()的语义。

内容的提问来源于stack exchange,提问作者Robert Hairgrove

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:05:59