Расширение 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) { ... }