我应该如何添加Protobuf消息的方法?
假设我的.proto文件中有:
package proto;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
我想在消息中添加一个方法,比如字符串concatenateNameEmail()
。
我现在所做的是创建我自己的C ++类:
class Person : public proto::Person
{
public:
Person( proto::Person const & person_ )
: proto::Person(person_)
{}
string concateNateNameEmail()
{
...
}
};
所以缺点是我需要调用proto :: Person复制构造函数。有比这更优雅的解决方案吗?
答案 0 :(得分:13)
Google Protobufs特别不打算进行扩展。这是文档中的一个段落(在这个中间:http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):
协议缓冲区和O-O设计 协议缓冲类基本上是 愚蠢的数据持有者(如结构中的结构) C ++);他们没有做好头等舱 公民在对象模型中。如果你 想要为a添加更丰富的行为 生成类,最好的方法 这是包装生成的协议 缓冲类在 特定于应用程序的类。 ...... 你 永远不应该添加行为 通过继承生成类 他们。这将打破内部 机制并不好 无论如何,面向对象的实践。
如果你只想要一种方法,我可以看到这样的建议看起来很烦人,但总的来说这是非常好的建议。如果你真的没有其他功能来保证创建一个特定于应用程序的“Person”类,那么定义一个顶级函数没有任何问题:
string concatenateNameEmail(const proto::Person &person) { ... }