Расширение Protobuf своими методами
как добавить методы в сообщение Protobuf?
Предположим, у меня в моем .файл proto:
package proto;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
и я хочу добавить метод, скажем, string concatenateNameEmail()
на сообщение.
сейчас я создаю свой собственный класс C++ следующим образом:
class Person : public proto::Person
{
public:
Person( proto::Person const & person_ )
: proto::Person(person_)
{}
string concateNateNameEmail()
{
...
}
};
таким образом, недостатком является то, что мне нужно вызвать Proto::person copy constructor. Есть ли более элегантное решение, чем это?
1 ответов
Google Protobufs специально не предназначены для расширения. Вот абзац из документации (в середине этого:http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):
буферы протокола и конструкция O-O Классы буферов протокола в основном тупые держатели данных (например, структуры в C++); они не делают хороший первый класс граждане в объектной модели. Если вы хотите добавить богаче поведения в сгенерированный класс, лучший способ сделать это должно обернуть сгенерированный протокол класс буфера в класс, специфичный для приложения. ... вы никогда не следует добавлять поведение сгенерированные классы путем наследования от их. это нарушит внутренний механизмы и не хорошо объектно-ориентированная практика.
Я вижу, как такой совет будет казаться раздражающим, если вы хотите только один метод, но в целом это довольно хороший совет. Если у вас действительно нет других функций, чтобы создание класса "Person" для конкретного приложения, нет ничего плохого в определении функции верхнего уровня:
string concatenateNameEmail(const proto::Person &person) { ... }