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).