如果我现在在StateB。 Sig2来了。因此,不会执行任何进入或退出,而只会执行Act5。到目前为止一切都很好。
现在我们在StateC,但这次Sig1来了。已定义内部转换,但处于父复合状态。我是否必须退出StateC,执行Act2并转到初始连接器并进入StateB?
我没有在UML标准中找到这个问题的答案。
答案 0 :(得分:2)
您不需要退出StateC
,只要您处于其某些子状态,就可能始终发生拥有状态的内部转换。
14.5.12.3文字
- 内部
- 表示如果触发转换,则在不退出或进入源状态的情况下发生(即,它不会 引起状态变化)。这意味着不会调用源状态的进入或退出条件。 <强>一种 即使SateMachine位于关联状态中的一个或多个区域中,也可以进行内部转换。
这是有道理的 - 你总是处于复合状态的某个子状态。 (一旦您输入复合状态,它会立即(在entry
行为之后)进入第一个状态)。
当然内部转换不会改变状态配置,因此它将保持不变(<StateA::StateC>
)。
这一切当然是假设你被传送到StateC
,因为该状态无法访问。
答案 1 :(得分:0)
The Wikipedia article on UML statecharts目前做出了一个明确的断言,解决了这个问题:
与自转换相反,即使内部转换继承自层次结构的更高级别而不是当前活动状态,也不会因内部转换而执行任何进入或退出操作。 在任何嵌套级别从超级状态继承的内部转换就像直接在当前活动状态中定义一样。
不幸的是它没有采购。我同意@ user2281723该规范含糊不清。来自UML 2.5的§14.2.3.8.1:
内部是本地转换的一种特殊情况,即自我转换(即具有相同的来源和 目标国家),使国家永远不会退出(因此,不再重新进入),......
如果这意味着不退出整个活动状态配置(嵌套层次结构中的所有活动状态),则不会发生状态更改。如果仅仅意味着没有退出拥有内部转换的特定状态,那是不是意味着将退出所有子状态并且具有转换的状态将成为活动状态?这是模型中转换的目标状态。
我怀疑规范编写者的第一个含义是在实践中使用的。希望最终会在规范中加入澄清。