首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当一个类从多个类继承到UML中的分类器行为时,它应该如何表现?

当一个类从多个类继承到UML中的分类器行为时,它应该如何表现?
EN

Stack Overflow用户
提问于 2021-07-09 10:25:50
回答 2查看 154关注 0票数 2

给定类继承层次结构:

上面写着:

代码语言:javascript
复制
class S inherits A1 and A2
class A1 and A2 inherits B1
class A2 inherits B2
class B2 inherits C1

对于类A1、B1、B2、C1,它们设置了classifierBehavior属性,而类S没有classiferBehavior。

现在的问题是,当我对S类运行模拟时,应该执行什么行为?

在Cameo中,仿真引擎将执行A1B1B2的分类器行为。

这是正确的方法,可以从UML规范中派生出来吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-12 09:49:49

UML规范没有告诉我们如何处理多个继承的classifierBehaviors。然而,fUML规范指出:

fUML 1.5 (第151页):5 startBehavior .为该对象激活的每种类型创建分类器行为调用,该对象具有分类器行为.

因此,我认为Cameo模拟引擎按照指定的方式工作,因为超级类型在对象的类型列表中。而且这真的很有道理。如果某物有两种类型,它应该表现出这两种类型的行为。例如,逆变器-充电器将对事件作出反应,一个逆变器和一个充电器的反应。

我在规范中没有发现的一件事是,当一个类有一个classifierBehavior时,继承的行为应该被它替换。我认为这是有意义的,因为否则继承的行为永远不会改变。模拟引擎正是这样做的。

现在,您可以选择继承的行为之一,而不是定义新行为或并发执行它们。这可以通过定义带有继承classifierBehavior的泛化的空行为来完成,并将其赋值为classifierBehavior。不过,这在模拟引擎中不起作用。fUML排除了ActivityNodes的重新定义,因此这可能是活动泛化不起作用的一个解释。然而,“状态机的精确语义”规范允许重新定义状态。

因此,我发现的唯一方法是创建一个新的classifierBehavior,并调用其中一个继承的行为。

解决操作方法的情况是不同的。例如,它可以有一个输出。在这里,只有建模者才能决定哪些输出应该返回。这是通过定义操作的新版本来完成的,该操作重新定义了两个旧版本,并从所需的祖先中选择行为作为新操作的方法。我认为这是相当直截了当的,没有理由拒绝多重继承。

票数 0
EN

Stack Overflow用户

发布于 2021-07-09 12:40:44

我浏览了UML 2.5规范,并在第288页找到了这一段:

如果接收对象的类拥有在CallEvent中标识的操作的方法,那么该方法就是解析的结果。否则,将检查接收对象类的超类,以查找操作方法,等等,直到找到方法或到达层次结构的根为止。如果一个类有多个超类,那么所有这些类都将被检查为一个方法。如果没有找到任何方法,或者在不同路径的多个祖先类中发现了一个方法,那么对于这个解析过程,模型是不正确的,并且它导致没有方法.

所以你来了。定义多个行为是无效的。除此之外,您可以/必须用新的东西覆盖行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68315232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档