Je suis nouveau à la programmation de classe générique alors peut-être ma question est stupide - désolé. Je voudrais savoir si la chose suivante est possible et - si oui, comment le faireC++ classes génériques et l'héritage
J'ai un simple fournisseur de classe générique, qui fournit des valeurs de type générique:
template <class A_Type> class Provider{
public:
A_Type getValue();
void setSubProvider(ISubProvider* subProvider)
private:
A_Type m_value;
ISubProvider* m_subProvider;
};
Le getValue La fonction retournera m_value dans le cas où m_subProvider est NULL. Mais si SubProvider n'est pas Null, la valeur doit être calculée par la classe SubProvider.
donc subprovider doit être de type générique aussi, mais je créer comme une classe abstraite sans mise en œuvre:
template <class A_Type> class ISubProvider{
public:
virtual A_Type getValue() = 0;
};
maintenant je veux que les implémentations actuelles de ISubProvider être non générique! par exemple, je veux mettre en œuvre IntegerProvider qui retourne le type entier
class IntegerProvider : public ISubProvider{
int getValue(){return 123;}
};
et peut-être un StringProvider:
class StringProvider : public ISubProvider{
string getValue(){return "asdf";}
};
maintenant - comment puis-je coder la chose, de sorte que je peux utiliser le
void setSubProvider(ISubProvider* subProvider)
fonction du fournisseur de classe uniquement avec un subprovider qui correspond au type générique de fournisseur?
par exemple, si j'instancier un fournisseur de type int:
Provider<int> myProvider = new Provider<int>();
alors il doit être possible d'appeler
myProvider.setSubProvider(new IntegerProvider());
mais il doit être impossible d'appeler
myProvider.setSubProvider(new StringProvider());
J'espère que vous comprenez ma question et peut me dire comment créer ce code correctement :)
Merci!