Расширение Protobuf моими собственными методами - PullRequest
9 голосов
/ 09 октября 2010

Как добавить методы в сообщение 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 Ответ

13 голосов
/ 10 октября 2010

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

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

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

string concatenateNameEmail(const proto::Person &person) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...