It is not possible to refer to an interface in the from-class clause of a deftemplate.
A class hierarchy including an abstract class can be mirrored as shown below. (deftemplate ClassA (declare (from-class AbstractClassA))) (deftemplate ClassB extends ClassA (declare (from-class ClassB))) (deftemplate ClassC extends ClassA (declare (from-class ClassC))) (defrule findA ?x <- (ClassA (name ?name)) => (printout t "Found a ClassA called " ?name crlf)) (defrule findB ?x <- (ClassB (name ?name)) => (printout t "Found a ClassB called " ?name crlf)) (defrule findC ?x <- (ClassC (name ?name)) => (printout t "Found a ClassC called " ?name crlf)) (reset) (add (new ClassB "objB1" "B1" )) (add (new ClassC "objC1" "C1" )) (facts) (run) Both facts are matched by the findA rule as well: f-0 (MAIN::initial-fact) f-1 (MAIN::ClassB (class <Java-Object:java.lang.Class>) (name "objB1") (value "B1") (OBJECT <Java-Object:play.ClassB>)) f-2 (MAIN::ClassC (class <Java-Object:java.lang.Class>) (name "objC1") (value "C1") (OBJECT <Java-Object:play.ClassC>)) For a total of 3 facts in module MAIN. Found a ClassC called objC1 Found a ClassA called objC1 Found a ClassB called objB1 Found a ClassA called objB1 4 Kind regards Wolfgang On 5/18/08, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > > I have the following class structure > > IInterface1 > getName() > IInterface2 extends IInterface1 > getValue() > > AbstractClassA implements IInterface2 > ClassB extends AbstractClassA, > ClassC extends AbstractClassA > > ClassD implements IInterface2 > > All 3 concrete classes implement IInterface2 and expose "getName". > > I'd like to write a Rule that matches a fact of any of the 3 concrete > classes (B, C, and D). I use the defclass construct for the various > types and interfaces and add 3 facts, one of each of the 3 concrete > classes. > > Two issues arise: > > First, when I try the following rule: > ?x <- (IInterface2 (name ?name)) => (printout t \"Found an > IInterface2 called \" ?name crlf) > "Message: No such slot name in template MAIN::Interface2 at token > 'name'." I only get this error on IInterface2. > > If I write comparable rules for all of the types and run them, only the > rules matching the concrete classes match. E.g. > ?x <- (AbstractClassA (name ?x_name) (OBJECT ?x_obj)) does not match but > ?x <- (ClassB (name ?x_name) (OBJECT ?x_obj)) does (only the one > instance of course). > > What's the best way handle this type of situation? I can send a zip with > sample code if that helps. Thanks. > > -Russ > > > > > > > > > -------------------------------------------------------------------- > To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]' > in the BODY of a message to [EMAIL PROTECTED], NOT to the list > (use your own address!) List problems? Notify [EMAIL PROTECTED] > -------------------------------------------------------------------- > >
