Jede in Ihrem Regelwerk definierte CER-Regelklasse kann in demselben Regelwerk als Datentyp verwendet werden.
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_ruleclassDataType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Person"> <Attribute name="firstName"> <type> <javaclass name="String"/> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="favoritePet"> <type> <!-- The type of this attribute is a rule class defined elsewhere in this rule set. --> <ruleclass name="Pet"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> <Class name="Pet"> <Attribute name="name"> <type> <javaclass name="String"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> </RuleSet>
CER unterstützt die einfache Implementierungsübernahme für Regelklassen.
Eine Regelklasse kann optional eine Deklaration extends angeben, um sich für eine andere Regelklasse in demselben Regelwerk als Unterklasse zu definieren.
Eine Unterregelklasse übernimmt die berechneten Regelattribute aller ihr übergeordneten Klassen und kann optional jedes dieser Attribute überschreiben, um abweichende Ableitungsberechnungsregeln bereitzustellen.
Eine Unterregelklasse übernimmt auch die initialisierten Regelattribute aller ihr übergeordneten Klassen. Jeder Ausdruck "create" (siehe create) für die Unterregelklasse muss den Wert der initialisierten Attribute für alle übergeordneten Regelklassen der Unterregelklasse vor allen Deklarationen für die Unterregelklasse selbst angeben.
CER lässt die Deklaration eines Attributs als abstrakt zu (siehe abstract). Jede Regelklasse, die ein abstraktes Attribut definiert oder übernimmt (jedoch nicht überschreibt) muss selbst als abstrakt deklariert sein. Eine abstrakte Klasse kann nicht in einem Ausdruck "create" (siehe create) verwendet werden.
CER lässt zu, dass immer dort eine Regelobjektinstanz einer Regelklasse zurückgegeben wird, wo eine der übergeordneten Regelklassen erwartet wird.
Der CER-Regelwerkvalidierer meldet einen Fehler, falls ein Ausdruck in Ihrem Regelwerk versucht, einen inkompatiblen Wert zurückzugeben:
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_ruleclassInheritance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <!-- The CER rule set validator will insist that this rule class is marked abstract, because it contains an abstract rule attribute. --> <Class name="Resource" abstract="true"> <Initialization> <!-- Whenever a Resource rule object is created, its owner must be initialized. Since Resource is abstract, it cannot itself be used in a <create> expression, only concrete subclasses can. --> <Attribute name="owner"> <type> <ruleclass name="Person"/> </type> </Attribute> </Initialization> <!-- The monetary value of the resource. --> <Attribute name="value"> <type> <javaclass name="Number"/> </type> <derivation> <!-- Every resource has an amount, but it's calculated in a sub-class-specific way. --> <abstract/> </derivation> </Attribute> </Class> <!-- A building is a type of resource. --> <Class name="Building" extends="Resource"> <!-- The physical address of the building, e.g. 123 Main Street. The address value must be specified in addition to the inherited owner rule attribute, which is an initialized attribute on the super-rule class. --> <Initialization> <Attribute name="address"> <type> <javaclass name="String"/> </type> </Attribute> </Initialization> <!-- Building is a concrete class (no pun intended!), and so the CER rule set validator will insist that this class inherits or declares a calculation for all inherited abstract rule attributes. --> <Attribute name="value"> <type> <javaclass name="Number"/> </type> <derivation> <arithmetic operation="-"> <reference attribute="purchasePrice"> </reference> <reference attribute="outstandingMortgageAmount"/> </arithmetic> </derivation> </Attribute> <!-- The price originally paid for the building. --> <Attribute name="purchasePrice"> <type> <javaclass name="Number"/> </type> <derivation> <specified/> </derivation> </Attribute> <!-- The amount of outstanding loans or mortgages against this building. --> <Attribute name="outstandingMortgageAmount"> <type> <javaclass name="Number"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> <Class name="Vehicle" extends="Resource"> <Initialization> <Attribute name="registrationPlate"> <type> <javaclass name="String"/> </type> </Attribute> </Initialization> <Attribute name="value"> <type> <javaclass name="Number"/> </type> <derivation> <!-- The value of this type of Resource is directly specified, rather than calculated.--> <specified/> </derivation> </Attribute> </Class> <Class name="Person"> <!-- A sample attribute showing how initialized attributes are inherited. --> <Attribute name="sampleBuilding"> <type> <ruleclass name="Building"/> </type> <derivation> <create ruleclass="Building"> <!-- The first initialized rule attribute is inherited from Resource. Set this person to be the owner --> <this/> <!-- The second initialized rule attribute is specified directly on Building. Set the address of the Building. --> <String value="123 Main Street"/> </create> </derivation> </Attribute> <!-- a sample attribute which shows how a Building can be returned as a Resource (because a Building *IS* a Resource --> <Attribute name="sampleResource"> <type> <ruleclass name="Resource"/> </type> <derivation> <reference attribute="sampleBuilding"/> </derivation> </Attribute> </Class> </RuleSet>
Falls eine Regelklasse nicht mit "extends" angibt, dass eine andere Regelklasse erweitert wird, erweitert die Regelklasse automatisch die Stammregelklasse von CER, die ein einziges Regelattribut description enthält.
Das Regelattribut description stellt eine lokalisierbare Beschreibung der Regelobjektinstanz bereit. Regelklassen können für ihre Regelobjektinstanzen jederzeit die Ableitung der Regelberechnung von description überschreiben.
Jede Regelklasse übernimmt letztlich aus der Stammregelklasse (und enthält somit ein Regelattribut description). Dies entspricht in etwa der Tatsache, dass alle Java-Klassen aus java.lang.Object übernehmen.
Die Standardimplementierung des Regelattributs description, die von der Stammregelklasse bereitgestellt wird, verwendet den Ausdruck "defaultDescription" (siehe defaultDescription).