2017-09-19 1 views
0

J'ai 5 types de faits: BaseFact, AFact, BFact, CFact et DFact.Drools Instanceof avec héritage

AFact, BFact, CFact et DFact héritent tous de BaseFact.

J'ai quelques règles qui fonctionnent sur BaseFacts, que je ne peux plus exécuter sur CFacts ou DFacts.

Quelle est la meilleure façon de modifier mes règles BaseFact afin qu'elles ne fonctionnent que sur BaseFacts, AFacts et BFacts.

Y at-il une sorte de fonction instanceOf que je peux vérifier, comme celle-ci? Ou dois-je diviser cette règle en 2 nouvelles règles, pour AFact et BFact?

Répondre

0

Même s'il n'y a pas d'opérateur instanceOf, il existe plusieurs façons de réaliser ce que vous recherchez.

Voici quelques idées:

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

Une version plus méchant:

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 

Ou:

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

Si vous avez seulement 2 types concrets que vous voulez correspondre, puis d'avoir 2 règles individuelles ne semble pas non plus une mauvaise idée.

Hope it helps,

+0

'fait: BaseFact (this.class == AFact.class || == this.class BFact.class)' est ce que j'ai fini avec. – Jamie