当前位置: 首页 > 知识库问答 >
问题:

Can Drools规则具有多重继承

燕意蕴
2023-03-14

我是流口水的新手,熟悉使用扩展关键字来继承规则。问题是有没有办法继承多个规则?这类似于在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

共有2个答案

申屠项明
2023-03-14

我知道此线程很旧,但可以执行以下操作:

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

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

巫马善
2023-03-14

虽然还没有很好的文档记录,但drools中确实存在单一继承。它允许您创建扩展其他规则的规则。当且仅当超级规则和子规则的条件都为true时,子规则才会激发。(见下方我的笔记)。

在下面的示例中,“标志”是一个简单的Java类,有2个布尔值:isSuperTrue和isSubTrue。神奇的短语是将“超级”扩展为“子”规则定义的一部分。规则的名称(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中存在问题。最终要求将超级规则放在规则定义文件中的子规则之前。我已经确认5.6.0的错误已修复。CR1。

注2:此功能间接记录在5.5.0的发行说明中。第4.1.1.3节中的最终版本。核心主题是“条件命名结果”,但它利用了规则继承

 类似资料:
  • 问题内容: 我之所以学习,是因为我参加了考试,而大多数Java并没有很多问题,但是我偶然发现了一个我无法解释的规则。这是一个代码片段: 返回: 1 3 1 3 虽然我希望它会返回: 1 3 1 4 为什么a2的类型确定在AX中调用哪种方法? 我一直在阅读有关重载规则和继承的文章,但这似乎晦涩难懂,以至于我无法找到确切的规则。任何帮助将不胜感激。 问题答案: 这些方法调用的行为由Java语言规范(参

  • 问题内容: 我有三个类:,和。 继承自和(按此顺序)。的构造特征和不同。如何调用两个父类的方法? 我在代码中的努力: 产生错误: 我发现此资源用不同的参数集解释了多重继承,但他们建议对所有参数使用和。我觉得这很丑陋,因为我无法从子类的构造函数调用中看到将哪些参数传递给父类。 问题答案: 千万 不能* 使用,除非你知道自己在做什么。第一个参数告诉它寻找下一个要使用的方法时要 跳过的 类。例如,将查看

  • 主要内容:多继承下的构造函数,命名冲突在前面的例子中,派生类都只有一个基类,称为 单继承(Single Inheritance)。除此之外, C++也支持 多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、 C#、 PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A

  • dml2select Description:将数据库更新请求转换为只读查询请求,便于执行EXPLAIN Original: DELETE FROM film WHERE length > 100 Suggest: select * from film where length > 100 star2columns Description:为SELECT *补全表的列信息 Original:

  • 我对口水和探索完全陌生。到目前为止,我一直在使用一个规则和withing,我们使用if条件,就像Java一样。 2.我会使用函数,我知道的是用java编写函数并导入它们。 3.是否有可能在Drools中创建函数,并像在Java中一样使用? 我并没有以它应该使用的方式使用Drools,但到目前为止,规则还没有我们现在使用的规则那么复杂。任何帮助对我都是有用的。

  • 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能。 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗; Bat - 蝙蝠; Parrot - 鹦鹉; Ostrich - 鸵鸟。 如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次: 但是如果按照“能跑”和“能飞”来归类,我们就应该设计出这样的类的层次: 如果要把上面的两种分类都包含进来