2010-10-09 2 views
6

Как мне добавить методы сообщения Protobuf?Расширение 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() 
    { 
    ... 
    } 
}; 

Так недостатком является то, мне нужно вызвать прото :: Person конструктор копирования. Есть ли более элегантное решение, чем это?

+0

Я не думаю, что первый блок кода, содержащий " package "и" message "является синтаксисом C++. Причина, по которой« пакет »является синтаксисом, является, вероятно, потому, что это ключевое слово на каком-то языке, но я не думаю, что это ключевое слово в C++. – Arun

+0

Прости, что я не был чист. Первый блок кода - это определение прото-сообщения. Позвольте мне прояснить этот пост. – sivabudh

ответ

10

Google Protobufs специально не предназначены для продления. Вот абзац из документации (в середине этого: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):

протокол Буфера и O-O-классы буферного Design протокола, в основном тупые держатели данных (например, в структурах C++); они не делают хорошего первого класса граждан в объектной модели. Если вы хотите добавить более богатое поведение в класс сгенерированный , лучший способ сделать это , это обернуть сгенерированный протокол класса класса . ... Вы не должны добавлять поведение к сгенерированным классам, наследуя их от . Это нарушит внутренние механизмы и не очень хорошо объектно-ориентированная практика в любом случае.

Я вижу, как такой совет будет казаться раздражающим, если вы хотите только одного метода, но в целом это довольно хороший совет. Если вы действительно не имеете никакой другой функции, чтобы оправдать создание «Person» класса конкретного приложения, нет ничего плохого просто определить функцию верхнего уровня:

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