abstract

Expresión de marcador para indicar que la derivación del atributo debe especificarse en subclases concretas (o una de las superclases).

Si uno o más atributos en una clase de regla está marcado abstract, el validador de conjunto de reglas CER insistirá en que la propia clase se marque abstract="true" e impedirá que la clase de regla se utilice en cualquier expresión de create.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_abstract"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">

  <!-- Clase base para todos los tipos de prestación.
       Cada subclase concreta tiene su propio
       cálculo de "name" y "isEligible". -->
  <Class name="Benefit" abstract="true">
    <Initialization>
      <!-- La persona para la que se está
        determinando la elegibilidad de prestación. -->
      <Attribute name="person">
        <type>
          <ruleclass name="Person"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- El nombre de este tipo es prestación -->
    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <abstract/>
      </derivation>
    </Attribute>

    <!-- Indica si la persona es elegible para esta prestación. -->
    <Attribute name="isEligible">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <abstract/>
      </derivation>
    </Attribute>

  </Class>

  <!-- Una subclase concreta de prestación.
       Contiene derivaciones concretas para los atributos
       abstractos heredados.-->
  <Class name="MedicalBenefit" extends="Benefit">
    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <String value="Prestación médica"/>
      </derivation>
    </Attribute>
    <Attribute name="isEligible">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <all>
          <fixedlist>
            <listof>
              <javaclass name="Boolean"/>
            </listof>
            <members>
              <!-- NB el atributo de persona se hereda de prestación
 -->
              <reference attribute="isPoor">
                <reference attribute="person"/>
              </reference>
              <reference attribute="isSick">
                <reference attribute="person"/>
              </reference>
            </members>
          </fixedlist>

        </all>

      </derivation>
    </Attribute>
  </Class>


  <!-- Otra subclase concreta de prestación,
    con derivaciones concretas diferentes para los atributos
    abstractos heredados.-->
  <Class name="NeedyBenefit" extends="Benefit">
    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <String value="Prestación médica"/>
      </derivation>
    </Attribute>
    <Attribute name="isEligible">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <all>
          <fixedlist>
            <listof>
              <javaclass name="Boolean"/>
            </listof>
            <members>
              <reference attribute="isPoor">
                <reference attribute="person"/>
              </reference>
              <any>
                <fixedlist>
                  <listof>
                    <javaclass name="Boolean"/>
                  </listof>
                  <members>
                    <reference attribute="isHungry">
                      <reference attribute="person"/>
                    </reference>
                    <reference attribute="isDeprived">
                      <reference attribute="person"/>
                    </reference>
                  </members>
                </fixedlist>
              </any>
            </members>
          </fixedlist>

        </all>

      </derivation>
    </Attribute>
  </Class>

  <Class name="Person">

    <Attribute name="isPoor">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="isSick">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="isHungry">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="isDeprived">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>


    <!-- Una lista de todas las prestaciones para
         las que se está evaluando la persona.  -->
    <Attribute name="allBenefits">
      <type>
        <javaclass name="List">
          <ruleclass name="Benefit"/>
        </javaclass>
      </type>
      <derivation>
        <fixedlist>
          <listof>
            <ruleclass name="Benefit"/>
          </listof>
          <members>
            <!-- Crear instancias de la clases de regla concretas -->
            <create ruleclass="MedicalBenefit">
              <this/>
            </create>
            <create ruleclass="NeedyBenefit">
              <this/>
            </create>
          </members>
        </fixedlist>

      </derivation>
    </Attribute>

    <!-- Las prestaciones para las que esta persona
         es elegible.

         Tenga en cuenta que la lista es de la clase de
         regla abstracta "Benefit", pero que cada
         instancia concreta determina su
         elegibilidad de su propia manera.    -->
    <Attribute name="eligibleBenefits">
      <type>
        <javaclass name="List">
          <ruleclass name="Benefit"/>
        </javaclass>
      </type>
      <derivation>
        <filter>
          <list>
            <reference attribute="allBenefits"/>
          </list>
          <listitemexpression>
            <reference attribute="isEligible">
              <current/>
            </reference>
          </listitemexpression>
        </filter>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>