17. 流继承
流继承允许一个流继承另一个流的配置。 继承可以在流动和状态两个层面发生。 一个常见的用例是父流定义全局转换和异常处理程序,然后每个子流程可以继承这些设置。
为了找到父流,必须将其添加到流量注册,和其他流一样。
17.1. 流继承类似于Java继承吗?
流继承类似于 Java 继承,父源中定义的元素通过子节点被暴露。 然而,两者之间存在关键差异。
子流不能覆盖父流的元素。 父流和子流之间的类似元素会合并。 父流中的唯一元素被添加到子流中。
子流可以继承多个父流。 Java 继承仅限于单一类。
17.3. 国家级继承
状态级继承类似于流级继承,只不过只有一个状态继承父状态,而非整个流程。
与流继承不同,只允许单一父继承。
此外,还必须定义可继承的流态标识符。
流的标识符和流中的状态之间用字符分隔。#
父态和子态必须属于同一类型。 例如,视图状态不能继承端态,只能继承另一个视图状态。
<view-state id="child-state" parent="parent-flow#parent-view-state">
| 流级继承的意图是定义可添加到多个流定义中并共享的共同状态,而状态级继承的意图是从单一父状态延伸并合并。 流级继承适合组合和多重继承,但在州级,你仍然只能从单一父州继承。 |
17.4. 抽象流
父流通常并非设计为直接运行。
为了防止这些流动流动,可以标记为抽象.
如果一个抽象流尝试运行,则FlowBuilderException被抛出。
<flow abstract="true">
17.5. 继承算法
当子流继承父流时,父流和子流合并以创建新的流。 Web Flow 定义语言中每个元素都有规则,规范该元素如何合并。
有两种元素类型:
-
可合并:如果元素相似,可合并元素总是尝试合并。
-
不可合并:父流或子流中的不可合并元素始终完整地包含在最终流程中。 合并过程中不会被修改。
| 父流中通往外部资源的路径应为绝对路径。 当两个流合并时,除非父流和子流处于同一目录,否则相对路径会中断。 合并后,父流中的所有相对路径都相对于子流。 |
17.5.1. 可合并元素
如果元素类型相同且键位属性相同,则父元素的内容会与子元素合并。 合并算法继续合并合并的父和子元素的每个子元素。 否则,父元素作为新元素添加到子元素中。
在大多数情况下,父流添加的元素是在子流程的元素之后添加的。
该规则的例外包括动作元素(评价,呈现和设置)这些都被加在开头。
这使得父作的结果可以被子动作使用。
可合并元素包括:
-
作用态:ID上的合并 -
属性:名称合并 -
决策状态:ID上的合并 -
终态:ID上的合并 -
流:总是合并 -
如果:测试 -
端部:总是合并 -
进入时:总是合并 -
出场:总是合并 -
渲染时:总是合并 -
启动时:总是合并 -
输入:名称合并 -
输出:名称合并 -
担保:属性合并 -
子流态:ID上的合并 -
过渡: 合并时 和 异常时 -
视图状态:在id上的合并