17. 流继承
流继承允许一个流继承另一个流的配置。继承可以在流和状态级别进行。一个常见的用例是父流定义全局转换和异常处理程序,然后每个子流都可以继承这些设置。
为了找到父流,必须将其添加到flow-registry
,就像任何其他流一样。
17.1. 流继承与 Java 继承相似吗?
流继承与 Java 继承类似,因为父级中定义的元素是通过子级公开的。但是,存在关键差异。
子流不能覆盖父流中的元素。父流和子流之间的类似元素将被合并。父流中的唯一元素将添加到子流。
子流可以从多个父流继承。Java 继承仅限于单个类。
17.3. 状态级继承
状态级继承与流级继承类似,不同之处在于只有一个状态从父级继承,而不是整个流。
与流继承不同,只允许单个父级。此外,还必须定义要继承的流状态的标识符。流的标识符和该流中的状态由一个字符分隔。#
父状态和子状态必须是相同的类型。例如,视图状态不能继承自最终状态,只能继承另一个视图状态。
<view-state id="child-state" parent="parent-flow#parent-view-state">
流级继承的意图是定义要添加到多个流定义并在多个流定义之间共享的公共状态,而状态级继承的意图是从单个父状态扩展并与之合并。流级继承非常适合组合和多重继承,但是,在状态级别,您仍然只能从单个父级状态继承。 |
17.4. 抽象流
通常,父流不是设计为直接运行的。为了保护这些流不运行,可以将它们标记为abstract
. 如果抽象流尝试运行,则FlowBuilderException
被抛出。
<flow abstract="true">
17.5. 继承算法
当子流从其父流继承时,父流和子流将合并在一起以创建新流。Web 流定义语言中的每个元素都有规则来控制该特定元素的合并方式。
有两种类型的元素:
-
可合并:如果元素相似,则可合并元素始终尝试合并在一起。
-
不可合并:父流或子流中的不可合并元素始终完整地包含在生成的流中。它们不会作为合并过程的一部分进行修改。
父流中外部资源的路径应为绝对路径。合并两个流时,相对路径将中断,除非父流和子流位于同一目录中。合并后,父流中的所有相对路径都将变为相对于子流。 |
17.5.1. 可合并元素
如果元素类型相同且其键控属性相同,则父元素的内容将与子元素合并。合并算法将继续合并合并父元素和子元素的每个子元素。否则,父元素将作为新元素添加到子元素。
在大多数情况下,从父流添加的元素会添加到子流中的元素之后。此规则的例外情况包括作元素 (evaluate
,render
和set
) 添加到开头。这允许父作的结果由子作使用。
可合并的元素包括:
-
action-state
:在 ID 上合并 -
attribute
:在名称上合并 -
decision-state
:在 ID 上合并 -
end-state
:在 ID 上合并 -
flow
:始终合并 -
if
:测试 -
on-end
:始终合并 -
on-entry
:始终合并 -
on-exit
:始终合并 -
on-render
:始终合并 -
on-start
:始终合并 -
input
:在名称上合并 -
output
:在名称上合并 -
secured
:对属性进行合并 -
subflow-state
:在 ID 上合并 -
transition
:合并 on 和 on-exception -
view-state
:在 id 上合并