Clases de regla

Cualquier clase de regla CER definida en el conjunto de reglas puede utilizarse como un tipo de datos en el mismo conjunto de reglas.

<?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>
        <!-- El tipo de este atributo es una clase de regla
             definida en otro lugar de este conjunto de reglas.       -->
        <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>

Herencia

CER soporta una herencia de implementación simple para clases de regla.

Una clase de regla puede especificar opcionalmente una declaración extends para subclasificar otra clase de regla en el mismo conjunto de reglas.

Una clase de subregla hereda los atributos de regla calculados de todas sus clases ancestros y opcionalmente puede alterar temporalmente cualquiera de estos atributos para proporcionar reglas de cálculo de derivación diferentes.

Una clase de subregla también hereda los atributos de regla inicializados de todas las clases ancestro y cualquier expresión create para la clase de subregla debe especificar el valor de los atributos inicializados para todas las clases de regla ancestro de la clase de subregla antes que cualquier declarado en la propia clase de subregla.

CER permite declarar un atributo abstract. Cada clase de regla que define o hereda (pero no altera temporalmente) un atributo abstracto debe declararse a sí misma abstracta. Una clase abstracta no puede utilizarse en una expresión create.

CER permitirá que una instancia de objeto de regla de una clase de regla se devuelva siempre que se espere una de sus clases de regla ancestro.

El validador de conjunto de reglas CER informará de un error si una expresión del conjunto de reglas intenta devolver un valor incompatible:

<?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">


  <!-- El validador de conjunto de reglas CER insistirá en que esta
       clase de regla se marque como abstracta, porque contiene
       un atributo de regla abstracto. -->
  <Class name="Resource" abstract="true">
    <Initialization>
      <!-- Siempre que se crea un objeto de regla de recurso,
           se debe inciializar su propietario.

           Puesto que el recurso es abstracto, no se puede
           utilizar en una expresión <create>, sólo se
           pueden utilizar subclases concretas.-->
      <Attribute name="owner">
        <type>
          <ruleclass name="Person"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- El valor monetario del recurso. -->
    <Attribute name="value">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- Cada recurso tiene un importe, pero
             se calcula de una manera específica de subclase.-->
        <abstract/>
      </derivation>
    </Attribute>
  </Class>

  <!-- Un edificio es un tipo de recurso. -->
  <Class name="Building" extends="Resource">
    <!-- La dirección física del edificio,
         por ejemplo Granvía 123.

         Se debe especificar el valor de dirección
         además del atributo de regla de propietario
         heredado, que es un
         atributo inicializado en la clase
         de super-regla. -->
    <Initialization>
      <Attribute name="address">
        <type>
          <javaclass name="String"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- Building es una clase concreta
         y, por lo tanto, el validador de
         conjunto de reglas CER insistirá en que esta
         clase herede o declare un cálculo
         para todos los atributos de regla abstractos heredados. -->
    <Attribute name="value">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <arithmetic operation="-">
          <reference attribute="purchasePrice"> </reference>
          <reference attribute="outstandingMortgageAmount"/>
        </arithmetic>

      </derivation>
    </Attribute>

    <!-- El precio pagado originalmente por el edificio. -->
    <Attribute name="purchasePrice">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- El importe de préstamos o hipotecas pendientes para
         este edificio. -->
    <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>
        <!-- El valor de este tipo de recurso se
             especifica directamente, en lugar de calcularse.->
        <specified/>

      </derivation>
    </Attribute>

  </Class>

  <Class name="Person">

    <!-- Un atributo de ejemplo que muestra cómo se heredan los
         atributos inicializados. -->
    <Attribute name="sampleBuilding">
      <type>
        <ruleclass name="Building"/>
      </type>
      <derivation>
        <create ruleclass="Building">
          <!-- el primer atributo de regla inicializado
               se hereda de Resource.

               Establecer que esta persona sea el propietario -->
          <this/>
          <!-- El segundo atributo de regla inicializado
            se especifica directamente en Building.

            Establecer la dirección del edificio. -->
          <String value="Granvía 123"/>
        </create>
      </derivation>
    </Attribute>

    <!-- un atributo de ejemplo que muestra cómo un edificio puede ser
         devuelto como un recurso (porque un edificio *ES* un
         recurso -->
    <Attribute name="sampleResource">
      <type>
        <ruleclass name="Resource"/>
      </type>
      <derivation>
        <reference attribute="sampleBuilding"/>
      </derivation>
    </Attribute>


  </Class>

</RuleSet>

Clase de regla raíz

Si una clase de regla no especifica otra clase de regla para ampliarse, la clase de regla amplía automáticamente la clase de regla "raíz" de CER, que contiene un solo atributo de regla description.

El atributo de regla description proporciona una descripción localizable de la instancia de objeto de regla. Las clases de reglas pueden alterar temporalmente la derivación del cálculo de regla de description para las instancias de objeto de regla.

Finalmente cada clase de regla hereda de la clase de regla raíz (y, por lo tanto contiene un atributo de regla description), de forma similar a cómo todas las clases Java heredan finalmente de java.lang.Object.

La implementación predeterminada del atributo de regla description, proporcionado por la clase de regla raíz, utiliza la expresión defaultDescription.