2014-07-01 8 views
1

J'ai des objets de deux types: TActionInfo et TActionStats. Le premier décrit les caractéristiques de l'action et le second peut «manger» le premier et maintenir certaines statistiques basées sur de nombreuses actions.Hériter de la classe C++ de protobuf

Il est très pratique d'utiliser un protobuf dans ma tâche, car ces objets sont fréquemment sérialisés et désérialisés.

Il semble être une bonne idée que TActionStats devrait avoir une méthode comme

bool AddAction(const TActionInfo& action); 

Est-ce une bonne idée d'hériter d'une classe à partir de la classe de TActionStats google-de protobuf? C'est une bonne idée d'hériter de smth de protobuf en général?

+0

Je préférerais avoir des variables de classe protobuf internes au lieu de les hériter. Dans (encore plus) général, à mon humble avis, c'est la meilleure idée d'éviter autant que possible l'héritage. C'est rare je peux répondre à la question _ "Est un?" _ Avec oui. –

+0

Le design est * parfois * une question de goût. Quoi qu'il en soit, j'essaie d'éviter les noms de classes comme '... Info',' ... Stats', ou '... Data'. Quand je suis tenté de créer une telle classe, je me demande: Pourquoi la classe * real * (disons TAction') ne contient-elle pas ses infos et ses statistiques? Et si je veux juste une classe qui garde juste l'information sur une autre instance de classe, comment puis-je éviter de mélanger des couches d'abstraction? Regardez, vous avez une méthode 'AddAction' mais ce que vous ajoutez vraiment, c'est l'info de l'action. Couches mélangées. N'est-ce pas l'action que vous voulez ajouter ici? Considérez également [ceci] (http://en.wikipedia.org/wiki/Dependency_inversion_principle). – TobiMcNamobi

Répondre

3

Non, vous ne devriez pas sous-classer les types protobuf.

ce qui se passerait si vous avez intégré un TActionStats à l'intérieur d'un autre type de message:

message TEnvelope { 
    optional TActionStats stats = 0; 
    optional string recipient = 1; 
} 

Maintenant, lorsque vous appelez stats() ou mutable_stats() sur un TEnvelope, vous recevrez un TActionStats, pas votre sous-classe. Si vous avez un tas de code qui attend spécifiquement de recevoir votre sous-classe, vous ne serez pas en mesure d'appeler ce code (sans faire une copie), alors maintenant vous devez tout réécrire. Au lieu de cela, écrivez vos méthodes auxiliaires en tant que fonctions autonomes et indépendantes.

Questions connexes