Drools Instanceof with Inheritance

时间:2017-09-19 20:52:48

标签: drools

我有5种事实类型:BaseFact,AFact,BFact,CFact和DFact。

AFact,BFact,CFact和DFact都继承自BaseFact。

我有一些在BaseFacts上运行的规则,我不能在CFacts或DFacts上运行。

修改BaseFact规则的最佳方法是什么,以便它们只能在BaseFacts,AFacts和BFacts上运行。

我可以检查某种instanceOf函数,如下所示吗?

rule "BaseRule"
    when
        fact : BaseFact(this instanceOf AFact || this instanceOf BFact)
        ...
    then
        ...
end

或者我是否需要将此规则拆分为2条新规则,对于AFact和BFact?

2 个答案:

答案 0 :(得分:2)

即使没有instanceOf运算符,也有几种方法可以实现您的目标。

这些是一些想法:

rule "BaseRule"
when
    fact : BaseFact(class == AFact.class || == BFact.class)
    ...
then
    //note that the variable fact is still of type BaseFact
    ...
end

更糟糕的版本:

rule "BaseRule"
when
    fact : BaseFact()
    not CFact(this == fact)
    not DFact(this == fact)
    ...
then
    //note that the variable fact is still of type BaseFact
    ...
end

或者:

rule "BaseRule"
when
    AFact() OR
    BFact()
    ...
then
    //note you can't bind a variable to AFact or BFact
    ...
end

如果你只想要匹配2种具体类型,那么拥有2个单独的规则也不是一个坏主意。

希望它有所帮助,

答案 1 :(得分:0)

快速更新:我还可以使用:

rule "MyRow"
    dialect "mvel"
    when
        f1 : Wrapper( eval( nestedProperty#MyNestedClass  ), ... )
    then
        ...
end

这对于测试(嵌套)属性类非常方便。