使用我自己的方法扩展Protobuf

时间:2010-10-09 18:01:24

标签: c++ protocol-buffers

我应该如何添加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复制构造函数。有比这更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:13)

Google Protobufs特别不打算进行扩展。这是文档中的一个段落(在这个中间:http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):

  

协议缓冲区和O-O设计   协议缓冲类基本上是   愚蠢的数据持有者(如结构中的结构)   C ++);他们没有做好头等舱   公民在对象模型中。如果你   想要为a添加更丰富的行为   生成类,最好的方法   这是包装生成的协议   缓冲类在   特定于应用程序的类。 ...... 你   永远不应该添加行为   通过继承生成类   他们。这将打破内部   机制并不好   无论如何,面向对象的实践。

如果你只想要一种方法,我可以看到这样的建议看起来很烦人,但总的来说这是非常好的建议。如果你真的没有其他功能来保证创建一个特定于应用程序的“Person”类,那么定义一个顶级函数没有任何问题:

string concatenateNameEmail(const proto::Person &person) { ... }