2010-10-09 15 views
6

¿Cómo debo agregar métodos a un mensaje Protobuf?Extendiendo Protobuf con mis propios métodos

Supongamos que tengo en mi archivo .proto:

package proto; 
message Person { 
    required string name = 1; 
    required int32 id = 2; 
    optional string email = 3;  
} 

y quiero añadir un método, por ejemplo, la cadena concatenateNameEmail() al mensaje.

Lo que hago en este momento es crear mi propia clase de C++ como esto:

class Person : public proto::Person 
{ 
public: 
    Person(proto::Person const & person_) 
    : proto::Person(person_) 
    {} 

    string concateNateNameEmail() 
    { 
    ... 
    } 
}; 

lo tanto, el inconveniente es que necesito llamar proto :: Persona constructor de copia. ¿Hay una solución más elegante que esta?

+0

no creo que el primer bloque de código que contiene " El paquete "y" mensaje "es una sintaxis válida de C++. La razón por la cual el" paquete "es la sintaxis resaltada es probablemente porque es una palabra clave en algún idioma, pero no creo que sea una palabra clave en C++. – Arun

+0

Lo siento, no estaba claro. El primer bloque de código es una definición de proto mensaje. Déjame aclarar la publicación. – sivabudh

Respuesta

10

Google Protobufs no están diseñados específicamente para ser extendidos. He aquí un párrafo de la documentación (en el medio de esto: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):

Protocol Buffers y O-O clases de amortiguamiento Diseño Protocolo son básicamente titulares de los datos tontas (como estructuras en C++); no hacen buenos ciudadanos de primera clase en un modelo de objetos. Si desea agregar un comportamiento más rico a una clase generada , la mejor manera de hacerlo es para envolver la clase de memoria de protocolo generada en una clase específica de la aplicación . ... Usted nunca debe agregar comportamiento a las clases generadas al heredar de ellas. Esto romperá los mecanismos internos y no es bueno práctica orientada a objetos de todos modos.

Veo cómo este consejo puede parecer molesto si solo quieres ese método, pero en general es un buen consejo. Si realmente no tiene otra funcionalidad para justificar la creación de una clase "Persona" específica de la aplicación, no hay nada malo con sólo la definición de una función de nivel superior:

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