🥯链路继承🧪 Beta
LiteFlow从2.11.1版本起,支持chain之间的继承关系,使得chain之间可以进行继承和扩展。
❗注意: 本特性为Beta实验性功能,不保证后续小版本升级能够向下兼容。
# 使用方法
可以在某个chain中使用extends
属性来指明该chain继承自哪个chain。在被继承的chain中,需要预留出一个或多个占位符,以便于子chain可以对其进行扩展;而在子chain中,需要对被继承的父chain中的所有占位符进行实现。
子chain中的实现可以是组件,可以是表达式,可以是其他chain的id。但是需要注意的是,最终实现的chain必须是一个合法的EL规则,否则会解析失败。子chain的实现中同样可以包含占位符,从而实现多级继承。
# 例子
下面是一个基本的例子:
<chain id="base">
THEN(a, b, {0}, {1});
</chain>
<chain id="implA" extends="base">
{0}=IF(c, d, e);
{1}=SWITCH(f).to(j,k);
</chain>
通过上述定义,实现了一个继承自base的implA,最终实现的implA流程如下
<chain id="implA">
THEN(a, b, IF(c, d, e), SWITCH(f).to(j,k));
</chain>
下面是一个多级继承的例子:
<chain id="base">
THEN(a, b, {0}, {1});
</chain>
<chain id="base2" extends="base">
{0}=THEN(a,b,{3});
{1}=SWITCH(f).to({4},k);
</chain>
<chain id="implB" extends="base2">
{3}=THEN(a,b);
{4}=j;
</chain>
在上面的定义中,implB继承自base2,base2又继承自base,最终实现的implB流程如下:
<chain id="implB" extends="base2">
THEN(
a, b,
THEN(a, b,
THEN(a,b)
),
SWITCH(f).to(j,k)
);
</chain>
# 注意事项
在继承chain和被继承chain中需要使用形如{x}的占位符,其中x可以是以下两种形式之一:
- 纯数字构成
- 由字母、下划线以及数字构成,但是数字不能作为开头
也就是说,形如{1}、{a}、{a1}、{a_1}都是合法的占位符,而{1a}、{1_a}都是非法的占位符。
请保证被继承chain中至少有一个占位符,且在被继承chain中定义的所有占位符,都必须要在子chain中进行实现,否则会抛出异常。
如果一个chain中包含未被实现的占位符,那么执行该chain会抛出异常。例如,尝试执行上文所述的base,base2都会抛出异常,因为它们分别包含未被实现的占位符{0},{1}和{3},{4}。
如果在子chain中定义了除占位符实现以外的其他表达式,那么该表达式将被忽略。举个例子,如果implA这样实现:
<chain id="implA" extends="base"> {0}=IF(c, d, e); {1}=SWITCH(f).to(j,k); THEN(a,b); </chain>
那么其中的
THEN(a,b);
将会被忽略。