Soucis conceptuel : peur de l'héritage multiple
Bonjour à tous,
J'ai créé une classe de base qui a la possibilité "d'enregistrer ses membres".
Exemple :
Code:
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:
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:
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:
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:
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:
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:
1 2 3 4 5 6
|
CIdentData
|
CLocalityData
|
CVehicle |
Mais comme CIdentData et CLocalityData dérivent de CBaseData on aura
Code:
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