1

我正在处理扩展 Drools 中的公共基类的消息,并且对于一种类型,我需要为规则条件中的变量定义调用不同的 getter。对于异常和所有其他类,值都是int但 getter 名称不同。否则规则完全相同,这就是为什么我试图在一个规则中解决它。

public class ClassBase {
    private int baseVal = 42;
    public int getBaseVal() {
        return baseVal;
    }
}

public class ClassA extends ClassBase {
    private int myVal = 42;
    public int getAval() {
        return myVal;
    }
}

public class ClassB extends ClassBase {
    private int myVal = 42;
    public int getBval() {
        return myVal;
    }
}

public class SomeClassWithInt {
    private int comp = 42;
    public int getComp() {
        return comp;
    }
}

我的目标是使用该变量来查找其他事实并在结果中使用它。

rule "different getter depending on class type"
when
    $base: ClassBase()
    ( ClassB( this == $base, $value: bval ) or
      not ClassB( this == $base, $value: baseVal ))
    $some: SomeClassWithInt( comp == $value )
then
    System.out.println($value);
end

现在,如果我添加一个ClassA、一个ClassB和一个SomeClassWithInt事实并调用fireAllRules()这个规则不会触发。如果我用ClassA(...)替换not classB(...)部分,它就像我想要的那样工作。

谁能告诉我为什么not版本不起作用?

4

2 回答 2

2

经过一番研究,我找到了解决方案。

rule "Working"
when
    $base: ClassBase( )
    (ClassB( this == $base, $value : bval ) or
    ClassBase( this == $base, $cl : class, $cl != ClassB, $value : baseVal) )
then
    // Do something with $value
end

正如此评论中所述,我之前尝试过此操作,但没有分配不需要的分配,$cl但我的 Drools 版本(它是自定义版本,不确定它基于哪个版本)似乎有一个错误,并且版本class != ClassB只是不行。

于 2013-09-27T11:05:35.173 回答
0

显然,满足条件not ClassB(this == $base, $value:baseVal)意味着$value保持unbound。因此 Drools 正确地拒绝让你使用这个变量。

于 2013-09-16T10:36:59.990 回答