Toute classe de règles CER définie dans votre jeu de règles peut être utilisée comme type de données de ce jeu de règles.
<?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> <!-- Le type de cet attribut est une classe de règles définie à un autre endroit de ce jeu de règles. --> <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 prend en charge l'héritage d'implémentation simple pour les classes de règles.
Une classe de règles peut éventuellement spécifier une déclaration étend pour créer une sous-classe contenant une autre classe de règles du même jeu de règles.
Une sous-classe de règles hérite des attributs de règle calculés de toutes ses classes ancêtre, et peut éventuellement remplacer n'importe lequel de ces attributs afin de fournir des règles de calcul de dérivation différentes.
Une sous-classe de règles hérite également des attributs de règle initialisés de toutes ses classes ancêtre, et toute expression create liée à la sous-classe de règles doit indiquer la valeur des attributs initialisés de toutes les classes de règles ancêtre liées à la sous-classe de règles avant celles déclarées sur la sous-classe de règles elle-même.
CER autorise un attribut à être déclaré abstract. Chaque classe de règles qui définit ou hérite d'un attribut abstrait (sans le remplacer) doit également être déclarée abstraite. Une classe abstraite ne peut pas être utilisée dans une expression create.
CER permet à une instance d'objet de règle d'une classe de règles d'être renvoyée à chaque fois que l'une de ses classes de règles ancêtre est attendue.
Le valideur de jeu de règles CER signale une erreur si une expression de votre jeu de règles tente de renvoyer une valeur 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"> <!-- Le valideur de jeu de règles CER insiste pour que cette classe de règles soit marquée comme abstraite, car elle contient un attribut de règle abstrait. --> <Class name="Resource" abstract="true"> <Initialization> <!-- A chaque fois qu'un objet de règle Ressource est créé, son propriétaire doit être initialisé. Etant donné que la ressource est abstraite, elle ne peut pas être utilisée dans une expression <create> ; cela n'est possible que pour les sous-classes concrètes. --> <Attribute name="owner"> <type> <ruleclass name="Person"/> </type> </Attribute> </Initialization> <!-- La valeur monétaire de la ressource. --> <Attribute name="value"> <type> <javaclass name="Number"/> </type> <derivation> <!-- Chaque ressource a un montant, mais celui-ci est calculé selon une méthode spécifique à la sous-classe. --> <abstract/> </derivation> </Attribute> </Class> <!-- Un bâtiment est un type de ressource. --> <Class name="Building" extends="Resource"> <!-- L'adresse physique du bâtiment, par exemple, 123 Main Street. La valeur d'adresse doit être spécifiée en complément de l'attribut de règle de propriétaire hérité, qui est un attribut initialisé de la super-classe de règles. --> <Initialization> <Attribute name="address"> <type> <javaclass name="String"/> </type> </Attribute> </Initialization> <!-- Les bâtiments constituent une classe concrète, donc le valideur de jeu de règles CER insiste pour que cette classe hérite d'un calcul ou le déclare pour tous les attributs de règle abstraits hérités. --> <Attribute name="value"> <type> <javaclass name="Number"/> </type> <derivation> <arithmetic operation="-"> <reference attribute="purchasePrice"> </reference> <reference attribute="outstandingMortgageAmount"/> </arithmetic> </derivation> </Attribute> <!-- Le prix initialement payé pour le bâtiment. --> <Attribute name="purchasePrice"> <type> <javaclass name="Number"/> </type> <derivation> <specified/> </derivation> </Attribute> <!-- Le montant des prêts ou des hypothèques en cours pour ce bâtiment. --> <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> <!-- La valeur de ce type de ressource est spécifiée directement, et non calculée.--> <specified/> </derivation> </Attribute> </Class> <Class name="Person"> <!-- Un exemple d'attribut illustrant comment les attributs initialisés sont hérités. --> <Attribute name="sampleBuilding"> <type> <ruleclass name="Building"/> </type> <derivation> <create ruleclass="Building"> <!-- Le premier attribut de règle initialisé est hérité de la ressource. Définir cette personne comme le propriétaire --> <this/> <!-- Le second attribut de règle initialisé est spécifié directement sur le bâtiment. Définir l'adresse du bâtiment. --> <String value="123 Main Street"/> </create> </derivation> </Attribute> <!-- un exemple d'attribut qui montre comment un bâtiment peut être renvoyé en tant que ressource (car un bâtiment *IS* une ressource --> <Attribute name="sampleResource"> <type> <ruleclass name="Resource"/> </type> <derivation> <reference attribute="sampleBuilding"/> </derivation> </Attribute> </Class> </RuleSet>
Si une classe de règles ne spécifie aucune autre classe de règles à étendre, la classe de règles étend automatiquement la classe de règles racine de CER, qui contient un seul attribut de règle description.
L'attribut de règle description fournit une description localisable de l'instance d'objet de règle. Les classes de règles peuvent remplacer librement la dérivation du calcul de règle description de leurs instances d'objet de règle.
Chaque classe de règles hérite finalement de la classe de règles racine (et contient donc un attribut de règle description), de la même manière dont toutes les classes Java héritent finalement de java.lang.Object.
L'implémentation par défaut de l'attribut de règle description, fournie par la classe de règles racine, utilise l'expression defaultDescription.