2

给定一个类继承层次结构:

示例类继承层次结构

其中说:

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类没有分类行为。

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

在 Cameo Systems Modeler 中,模拟引擎将执行A1B1B2的分类器行为。

这是正确的方法并且可以从 UML 规范派生吗?

4

2 回答 2

0

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

如果接收对象的 Class 拥有 CallEvent 中标识的 Operation 方法,则该方法是解析的结果。否则,将检查接收对象的 Class 的超类以查找操作的方法,依此类推,直到找到方法或到达层次结构的根。如果一个类有多个超类,那么所有的超类都会被检查一个方法。如果没有找到方法,或者在不同路径上的多个祖先类中找到方法,那么该解析过程的模型是不正确的,它会导致没有方法。

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

于 2021-07-09T12:40:44.553 回答
0

UML 规范没有告诉我们如何处理多个继承的分类器行为。但是,fUML 规范说:

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

所以,我认为 Cameo 模拟引擎按规定工作,因为超类型在对象的类型列表中。而且,这真的很有意义。如果某物有两种类型,它应该表现出两种类型的行为。例如,逆变器-充电器将对逆变器和充电器做出反应的事件做出反应。

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

现在,您可能想要选择一种继承的行为,而不是定义新的行为或同时执行它们。这可以通过定义一个对继承的分类器行为进行泛化的空行为并将其分配为分类器行为来完成。但是,这在模拟引擎中不起作用。fUML 不包括对 ActivityNodes 的重新定义,因此这可以解释为什么 Activity 泛化不起作用。但是,“状态机的精确语义”规范允许重新定义状态。

所以我发现的唯一方法是创建一个新的分类器行为并调用其中一个继承的行为。

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

于 2021-07-12T09:49:49.907 回答