2014-07-01 136 views
1

我有两种类型的对象:TActionInfo和TActionStats。第一个描述行动的特点,第二个可以“吃”第一个,并根据许多行动维护一些统计数据。从protobuf继承C++类

在我的任务中使用protobuf非常方便,因为这些对象经常被序列化和反序列化。

这似乎是TActionStats应该有一个像

bool AddAction(const TActionInfo& action); 

是它从谷歌-protobuf的TActionStats类继承一个类是一个好主意的方法是一个好主意? 一般继承protobuf的smth是个好主意吗?

+0

我宁愿实习protobuf类成员变量而不是继承它们。在(甚至更多)一般情况下,恕我直言,尽可能避免继承是个好主意。这很少见,我可以回答这个问题_“是?”_是的。 –

+0

设计有时是一种品味的问题。无论如何,我尽量避免类名如'... Info','... Stats'或'... Data'。当我想要创建这样一个班级时,我会问自己:为什么* real *类(比如'TAction')不包含它的信息和统计信息?如果我真的只想要一些只保留有关另一个类实例的信息的类,我该如何避免混合抽象层?看,你有一个'AddAction'方法,但你真正添加的是动作信息。图层混合。这不是你想在这里添加的动作吗?另请考虑[this](http://en.wikipedia.org/wiki/Dependency_inversion_principle)。 – TobiMcNamobi

回答

3

不,你不应该继承protobuf类型。

考虑,如果你嵌入一些其他的消息类型内TActionStats会发生什么:

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

现在,当您在TEnvelope致电stats()mutable_stats(),您将收到TActionStats,不是你的子类。如果你有一堆代码需要专门接收你的子类,你将无法调用该代码(没有制作副本),所以现在你必须重写所有的东西。

相反,编写你的帮手方法作为独立的,独立的功能。