Mode d'installation de la hiérarchie :
Les entités du domaine sont regroupées par l'utilisateur en classes et sous-classes, qui héritent de la classe prédéfinie BasicEntity (et généralement de sa sous-classe Entity), directement (pour les classes) ou indirectement (pour les sous-classes).
A chaque classe d'entité propre à l'application, l'utilisateur doit associer une instance d'une classe prédéfinie dédiée à la gestion des classes d'entités : c'est la classe MetaClass, une "classe sur les classes", appelée ci-après "métaclasse". Pour la classe d'entités A, cette instance encapsule des informations générales telles que le nombre et la liste des instances de A déjà créées et, c'est l'objet de la présente documentation, la place de A dans la hiérarchie des classes d'entités.
Ainsi, pour installer une hiérarchie de classes d'entités, l'utilisateur opére normalement de la façon suivante :
- Les classes du domaine. Un fichier UserEntity.h contient la déclaration des classes du domaine, avec pour le moins un constructeur sans argument, et avec spécification de l'héritage. Dans cet exemple, la classe A hérite de la classe B :
class A : public Entity { public: A();}; class B : public A { public: B();};- Les métaclasses. Quelque part dans le code, mais normalement dans une fonction dédiée, couramment appelée App_InstallMetaClasses, on crée les instances de MetaClass associées à A et B ... :
void App_InstallMetaClasses() { MetaClass* pMC; pMC = CreateMetaClass(ID_A, "a"); pMC->SetParentClassId(BD_ENTITY); pMC = CreateMetaClass(ID_B, "b"); pMC->SetParentClassId(ID_A); }... où ID_A et ID_B (resp. "a" et "b") sont les symboles (resp. les noms) de classes choisis pour A et B.
Cette fonction est invoquée au début du code de toute application (mais après la création d'une instance de Simulation et après l'invocation de D_InstallMetaClasses, qui a le même rôle pour les classes prédéfinies de DIESE).
int main(int argc, char argv[]) { ... pCurrentSim = new Simulation(); D_InstallMetaClasses(); App_InstallMetaClasses(); SetHierarchy(); ... }- Les constructeurs des classes du domaine. Le fichier UserEntity.cc contient la réalisation des constructeurs des classes d'entités. Chaque constructeur installe le lien entre la classe d'entités et sa métaclasse. En outre , le constructeur précise les types des composants ou le type des éléments de l'entité, les types des sur-ensembles, les classes des descripteurs constants et variables (voir page 'Les entités').
A::A() { SetMetaClass(ID_A); AddInstanceToClass(); ... ElementClassId(ID_A_ELEM); AddSuperSetClassIdID_SET_OF_A); Descriptor* pD = new X(); AddConstantDescriptor(pD); ... } B::B() { SetMetaClass(ID_B); AddInstanceToClass(); ... }SetMetaClass(ID_A) installe dans l'instance de A un pointeur vers la métaclasse (toutes les instances de A pointent vers la même métaclasse).
AddInstanceToClass() ajoute dans la métaclasse un pointeur vers l'instance de A. Donne en outre un nom propre à l'instance (on l'appelle le "nom d'instance"), construit comme la concaténation du nom de classe et d'un numéro d'ordre global unique (par exemple "a_118"). De manière plus générale, par AddInstanceToClass, l'instance créée est ajoutée à la liste des instances de toutes ses classes ascendantes jusqu'à la classe de base BasicEntity
- Les symboles des classes. Le fichier UserTypes.h contient l'énumération (nommée par exemple App_ClassId) des symboles de classe. Les nombres doivent être tous plus grand que la valeur de la variable globale g_BD_ReservedUserClassId.
enum App_ClassId {ID_A=11, ID_B};- Destructeurs. L'écriture d'un destructeur explicite n'est pas exigée. L'appel au destructeur implicite (par un delete <pointeur>; explicite ou bien dans DeleteInDepth) fait appel aux destructeurs implicites des classes ascendantes, jusqu'à celui de la classe de base des entités (BasicEntity). Ce dernier retire l'instance en cours de suppression de la liste des instances de toutes les métaclasses dont elle hérite, jusqu'à la métaclasse de base (voir page 'La classe des entités avec descripteurs et méthodes').