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