Bonjour à tous,
J'ai créé une classe de base qui a la possibilité "d'enregistrer ses membres".
Exemple :
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
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; }
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 class CIdentData : public CBaseData { protected : RegisterIdent(const std::string& rstrIdent); private: CPropertyMap<string, IProperty*> m_idents; }
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 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; }
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.
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; }
J'ai pensé à plusieurs trucs :
1)
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class CVehicle : public CBaseData, public CIdentData, public CLocalityData { }
2)
Je modifie ma conception pour faire hériter CBaseData de IProperty puis
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...
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; }
3) Utiliser une hiérarchie linéaire que génèrerai
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 CIdentData | CLocalityData | CVehicle
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
Partager