【问题标题】:Can Drools rules have Multiple InheritanceDrools 规则可以有多重继承吗
【发布时间】:2013-01-15 16:19:10
【问题描述】:

我是 drools 的新手,熟悉使用 extends 关键字来继承规则。问题有没有办法继承多个规则?这类似于在 java 类上使用多个接口。这是我希望它如何工作的示例,但我在规则 3 上遇到错误:

rule "rule 1"
when //person name == "John"
then //print "John"
end

rule "rule 2"
when //person last name == "Smith"
then //print "Smith"
end

rule "rule 3" extends "rule 1", "rule 2"
when //person age > 20
then //print John Smith is older than 20
end

【问题讨论】:

    标签: drools multiple-inheritance rules


    【解决方案1】:

    它还没有很好的记录,但是单继承确实存在于 drools 中。它允许您创建扩展另一个规则的规则。当且仅当超级规则和子规则的条件都为真时,子规则才会触发。 (见底部我的笔记)。

    在下面的示例中,“Flags”是一个简单的 Java 类,具有 2 个布尔值:isSuperTrue 和 isSubTrue。神奇的短语是扩展“super”作为“sub”规则定义的一部分。规则的名称(sub 和 super)是说明性的,可以更改为任何合法的规则名称。

    rule "super" 
        @description("Fires when isSuperTrue is true regardless of the state of isSubTrue")
        when
            $flag : Flags(isSuperTrue == true)
        then
            System.out.println("super rule should fire anytime super is true and ignore sub");
    end
    
    rule "sub" extends "super"
        @description("Fires only when both isSubTrue and isSuperTrue are true")
        when
            Flags(isSubTrue == true)        
        then
            System.out.println("sub rule should fire when both isSubTrue and isSuperTrue are true");
    end
    

    注1:5.5.0.Final中有一个issue,要求在规则定义文件中将超级规则放在子规则之前。我已确认该错误已针对 5.6.0.CR1 修复。

    注意 2:此功能在 5.5.0.Final 的第 4.1.1.3 节中间接记录在 release notes 中。核心主题是“条件命名结果”,但它利用了规则继承。

    【讨论】:

    • Mike - 上面的@Description 注释是drools 构造吗?如果是这样,你能告诉我更多关于它可以用来做什么的信息吗?我以前从未见过,似乎在他们的文档中找不到任何内容......
    【解决方案2】:

    我知道这个帖子很旧,但可以执行以下操作:

    rule "first name is John rule"
        when
            $p : Person(  name == 'John' )
        then
    end
    
    rule "last name is Smith rule" extends "first name rule"
        when
            eval( $p.getLastName() == "Smith" )
        then
    end
    
    rule "age older than 20 rule" extends "last name rule"
        when
            eval ( $p.getAge() > 20 )
        then
            System.out.println($p.getFirstName() + " " + $p.getLastName() +
                    " is older than 20");
    end
    
    rule "age younger than 20 rule" extends "last name rule"
        when
            eval ( $p.getAge() < 20 )
        then
            System.out.println($p.getFirstName() + " " + $p.getLastName() +
                    " is younger than 20");
    end
    

    如您所见,您可以从继承其声明变量的超级规则创建链式规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多