2016-10-14 3 views
1

J'ai une classe CGrandMother ayant une méthode publique virtual bool Compute() cela nemeilleure façon de Refactor Hiérarchie des classes

virtual bool Compute() 
{ 
    return false; 
} 

De CGrandMother publiquement CMother qui dérive ne met pas en œuvre Compute. Maintenant de CMother dérivez publiquement C1 et C2 qui implémentent virtual bool Compute(). Maintenant, virtual bool C1::Compute() et virtual bool C2::Compute() respectivement faire beaucoup de choses propres à respectivement C1 et C2, mais aussi beaucoup de choses identiques à CMother. Maintenant, il y a une classe CFamily ayant en tant que membre d'un pointeur vers CMother et presque partout dans le code Compute est appelé par les lignes de la forme

ptrCMother->Compute(); 

Comment pourrais-je factoriser les choses communes liées à CMother fait dans C1 et C2 donc que je n'aurais pas à changer toutes ces lignes ptrCMother->Compute();?

+1

Je ne suis pas sûr que ce soit une bonne pratique, mais pourriez-vous déplacer le code commun vers 'CMother :: Compute' et ensuite appeler manuellement' CMother :: Compute() 'en haut de' C1' et 'C2 '? – 0x5453

Répondre

2

La réponse devrait être assez simple. Vous avez dit "beaucoup de choses identiques à CMother". Donc, vous devriez les factoriser dans une fonction membre de CMother. Comme il semble que la fonctionnalité ne soit nécessaire que pour les classes dérivées de CMother, vous devez marquer la nouvelle fonction membre "protected". Ce que @ 0x5453 a dit est une manière; mais je suggère une nouvelle fonction, afin de laisser la méthode publique CMother :: Compute seule. Il pourrait y avoir une autre classe enfant de CMother qui n'implémente pas Compute et s'appuie sur CMother :: Compute pour faire certaines choses.

+0

Alors qu'il n'y a aucun moyen d'éviter d'appeler la nouvelle fonction membre 'CMother' à l'intérieur des fonctions 'Compute' de' C1' et 'C2' de' C2'? –

+0

Eh bien, vous demandiez "la meilleure façon" et je vous ai donné le meilleur moyen à mon avis. Il pourrait y avoir d'autres moyens. Pour n'en nommer que quelques-uns: C1 peut dériver de C2; la fonctionnalité commune pourrait être dans une fonction ami apparaissant purement dans un fichier .cpp et éventuellement dans un espace de noms anonyme; vous pourriez avoir une fonction de modèle; vous pourriez avoir une classe enfant de CMother qui agit comme parent de C1 et C2 ... –

+0

En fait dans 'C++', si vous avez 'B' qui dérive de' A', 'A :: do()' et ' B :: do() 'et si' p' pointe vers un type 'B' alors' p-> do() 'va exécuter' B :: do() 'par polymorphisme. Je voudrais savoir s'il y a un idiome/pattern me permettant de réaliser ceci: 'p-> do()' va exécuter 'A :: do()' et ensuite 'B :: do()', ce qui bien sûr Cela n'arrivera pas en 'C++' pour les fonctions membres de classe qui ne sont pas constructeur, etc. Ce serait une réponse encore plus nette, même si j'acceptais la vôtre. –