Regelklassen

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>

Übernahme

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>

Stammregelklasse

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