Bonjour à tous,


J'ai créé une classe de base qui a la possibilité "d'enregistrer ses membres".
Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
class CBaseData
{
protected:
  RegisterProperty(const std::string&, IProperty*);
private:
  CPropertyMap<string, IProperty*> m_map;
}
 
class CMyData : public CBaseData
{
public:
  CMyData()
  {
     RegisterProperty("MonEntier", m_iProperty);
     RegisterProperty("MaChaine", m_strProperty);
  }
private:
  CProperty<int> m_iProperty;
  CProperty<string> m_strProperty;
}
Maintenant je voudrais une classe qui va en plus gérer les propriétés identifiantes.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
class CIdentData : public CBaseData
{
protected :
  RegisterIdent(const std::string& rstrIdent);
private:
  CPropertyMap<string, IProperty*> m_idents;
}
Utilisation avec un véhicule possédant un identifiant unsigned long :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
class CVehicle : public CIdentData
{
public:
  RegisterProperty("ID", m_ulId);
  RegisterProperty("NOM", m_strName);
  RegisterIdent("ID");
private:
  CProperty<unsigned long> m_ulId;
  CProperty<string> m_strName;
}
J'aimerai également faire une donnée de localisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
class CLocalityData : public CBaseData
{
public :
  CLocalityData()
  {
      RegisterProperty("LATI", m_dLati);
      RegisterProperty("LONGI", m_dLongi);
  }
private :
  CProperty<double> m_dLati;
  CProperty<double> m_dLongi;
}
Mais là où ça se complique, c'est lorsque je souhaite que mon véhicule soit une donnée localisable ainsi qu'une donnée identifiable.
J'ai pensé à plusieurs trucs :
1)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
class CVehicle : public CBaseData, public CIdentData, public CLocalityData
{
 
}
Ca fait un héritage multiple en forme de losange. Est-ce que CIdentData et CLocalityData vont enregistrer leurs propriétés respectives dans le même CBaseData ?

2)
Je modifie ma conception pour faire hériter CBaseData de IProperty puis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
class CVehicle
{
public:
   CVehicle()
   {
       RegisterProperty("LOCALITY", m_locality);
       RegisterProperty("IDENTS", m_idents);
   }
private:
   CLocalityData m_locality;
   CIdentData m_idents;
}
Mais là ce qui m'embête c'est que c'est le développeur de CVehicle qui choisit les clé "LOCALITY" et "IDENTS", j'aimera les imposer les clés pour que si un autre développeur construise un client localisable, il n'ai pas le choix que de réutiliser ces deux clés...

3) Utiliser une hiérarchie linéaire que génèrerai
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
 CIdentData
      |
CLocalityData
      |
  CVehicle
Mais comme CIdentData et CLocalityData dérivent de CBaseData on aura
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
 CBaseData
       |
 CIdentData
       |
 CBaseData
       |
CLocalityData
       |
  CVehicle

Comment puis-je faire ?
La première solution semble bonne si seulement CVehicle, CLocalityData et CIdentData partagent le même CBaseData.
La seconde est bonne aussi seulement si les clés peuvent être imposées
Et la troisième j'ai aucune visu sur ce que ça produirai



Merci beaucoup,


Aurélien