Nous avons une hiérarchie de classe qui ressemble à quelque chose comme ceci:Même fonction, différents types de retour pour la hiérarchie des classes
class base
{
};
class derived1 : protected base
{
private:
float m_price;
int m_quantity;
float m_value;
public:
// float calculateValue();
};
class derived2 : protected base
{
private:
double m_price;
long m_quantity;
double m_value;
public:
// double calculateValue();
};
Maintenant, nous avons besoin d'écrire une fonction qui calcule la valeur en multipliant le prix et la quantité. Le but est de rendre aussi simple que possible d'ajouter de nouvelles classes dans le futur. Comme vous le savez peut-être, ce n'est pas simple car les types de données de ces champs sont différents pour différentes classes. En effet, nous avons ces fonctions pour faire la même chose sur le plan conceptuel, mais en termes de programmation, ce sont des opérations différentes.
Pour minimiser la quantité de couper et coller nécessaire, la solution que je peux penser à ce jour est d'utiliser les fonctions de modèle:
template <class A, B, C>
A calculate_value(B price, C quantity)
{
A result;
// Some code to do the multiplication, not sure if template specialisation is needed
return result;
};
class derived1 : protected base
{
private:
float m_price;
int m_quantity;
float m_value;
public:
float calculateValue()
{
calculate_value < float, float, int > (m_price, m_quantity);
}
};
Il fait son travail bien, mais cela signifie que je dois définir chaque fonction membre unique dans chaque classe. Par exemple, j'aurai besoin d'un grand nombre de ces fonctions de template si je veux avoir une fonction appelée getValue, disons.
Les types de données des membres de la classe sont connus lorsque la classe est définie, de sorte que le fait de devoir les replacer dans les définitions de fonction semble être une duplication. Existe-t-il un moyen possible d'éviter toute cette activité de modèle dans les définitions de fonctions?
Merci.
Andy
PS J'ai vu la question suivante, mais la question dans cette question est légèrement différente: Returning different data type depending on the data (C++)
Je suis d'accord que usinig mathématiques à virgule flottante pour la multiplication répétée/division n'est pas une bonne idée. Ceci est juste fait comme un exemple illustratif. Avec le recul, j'aurais pu choisir une autre opération. – Andy