2010-03-01 2 views
3

Lors de la création d'une structure d'héritage de C++, vous devez définir les fonctions membres exactement la même chose à plusieurs endroits:C++: éviter la double entretien dans l'héritage des hiérarchies

Si B est une classe de base abstraite et D, E et F tous héritent de B, vous pourriez avoir ceci:

class B 
{ 
    virtual func A(... params) = 0; 
}; 

class D : public B 
{ 
    func A(... params); 
}; 

/* ... etc... similar implementations for E and F */ 

Donc, il y a évidemment une certaine duplication ici. Si l'interface vers B est grande, vous pouvez avoir beaucoup d'endroits à changer si l'interface doit changer.

Un collègue de travail a suggéré ruser avec un #includes-créé astucieusement intégrés, ala:

class D: public B 
{ 
    #include "B_Interface.h" // B_Interface.h is a specially crafted .h file 
} 

Cela semble un peu kludgy? Est-ce? Y a-t-il une meilleure solution pour éviter la double maintenance?

En outre, peut-être la solution ici est vraiment de meilleurs outils pour soutenir le langage, comme Visual Assist X?

Édition: Supposons que les classes dérivées doivent avoir des implémentations uniques.

+0

La bibliothèque Boost fait cela à certaines parties, mais pas pour l'héritage, juste pour la réutilisation de code. –

+0

Pourquoi ne pas utiliser une macro plutôt qu'une inclusion? Le point étant que '# include 'implique la recherche d'un fichier alors qu'une macro est déjà dans la table des symboles. –

Répondre

12

En fait, le plus gros problème avec la modification d'une interface est généralement tout le code que utilise it, pas le code qui l'implémente. S'il est facile de le changer pour l'implémenteur, cela rendra probablement la vie plus difficile pour les utilisateurs.

+3

convenu - à mon humble avis et l'interface devrait être modifiée aussi peu que possible, donc si c'est une douleur c'est une bonne chose! –

1

Si vous devez les implémenter encore et encore avec un comportement par défaut alors peut-être qu'ils devraient simplement être virtuel, et non virtuel pur.

+0

Dans mon cas particulier, il existe une implémentation différente pour chaque classe dérivée. –

1

Au lieu d'utiliser le préprocesseur pour une autre façon il ne devrait pas être utilisé, je vais essayer mon éditeur (ou IDE, si c'est ce que vous aimez.)

4

Qu'il est douloureux de changer une interface largement utilisée est pas un bug; c'est une fonctionnalité.

4

Aussi, peut-être la solution ici est vraiment de meilleurs outils pour soutenir le langage, comme Visual Assist X?

Exactement. La modification des signatures de méthode est un key feature d'outils de refactoring.

+1

Je seconde la recommandation. Si vous devez refactoriser le code C++, j'ai trouvé VAX plutôt bon. (Et je l'ai trouvé assez bon pour beaucoup d'autres raisons, aussi.) – sbi

Questions connexes