[conception] variations sur le pattern "Template Method"
Bonjour à tous,
sur vos conseils, je suis parti sur l'implémentation d'un ensemble de classes en utilisant le Template Method. Ca donne à peu près ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Mere
{
[...]
void MethodImpl();
virtual void MethodDerivate() = 0;
};
class Fille1 : public Mere
{
void MethodDerivate(){<mon code ici>}
};
class Fille2 : public Mere
{
void MethodDerivate(){<mon code (différent) ici>}
}; |
Cela fonctionait très bien. Mais voilà qu'aujourd'hui, je dois apporter une modification. En effet, la classe Fille2 va maintenant devoir gérer des données propres à elle que Fille1 n'aura pas. Prenons un tableau de int pour l'exemple:
Code:
1 2 3 4 5
| class Fille2 : public Mere
{
void MethodDerivate(){<mon code (différent) ici>}
vector<int> m_array;
}; |
Jusque là, tout va bien. Je voudrais maintenant une méthode qui modifie ce tableau, qui le vide par exemple. Donc j'ai fait cela:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Mere
{
[...]
void MethodImpl();
virtual void MethodDerivate() = 0;
virtual void ClearArray() = 0;
};
class Fille1 : public Mere
{
void MethodDerivate(){<mon code ici>}
void ClearArray(){m_array.clear();}
vector<int> m_array;
};
class Fille2 : public Mere
{
void MethodDerivate(){<mon code (différent) ici>}
void ClearArray(){}
}; |
Jusqu'ici tout va bien. Le problème c'est que maintenant, je voudrais appeler ClearArray depuis une méthode implémentée dans la classe Mere, ce qui nous donnerais quelque chose comme cela:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Mere
{
[...]
void MethodImpl(ClearArray()); //modif ici
virtual void MethodDerivate() = 0;
virtual void ClearArray() = 0;
};
class Fille1 : public Mere
{
void MethodDerivate(){<mon code ici>}
void ClearArray(){m_array.clear();}
vector<int> m_array;
};
class Fille2 : public Mere
{
void MethodDerivate(){<mon code (différent) ici>}
void ClearArray(){}
}; |
Mais là, ça ne fonctionne pas. Ca plante à l'exécution:
Citation:
R6025: pure virtual call.
J'espère avoir été clair, et si vous m'avez suivi, je serais bien aise de recevoir vos conseils avisés ;)
merci.