2010-10-09 11 views
6

Come aggiungere metodi a un messaggio di Protobuf?Estensione di Protobuf con i miei metodi

Supponiamo che io sono nel mio file Proto:

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

e voglio aggiungere un metodo, diciamo, string concatenateNameEmail() al messaggio.

Quello che faccio in questo momento è che creo la mia stessa classe C++ in questo modo:

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

    string concateNateNameEmail() 
    { 
    ... 
    } 
}; 

Così il lato negativo è che ho bisogno di chiamare proto :: persona costruttore di copia. C'è una soluzione più elegante di questa?

+0

non credo che il primo blocco di codice contenente " pacchetto "e" messaggio "è sintassi C++ valida. Il motivo" pacchetto "è la sintassi evidenziata è probabilmente perché è una parola chiave in qualche lingua, ma non penso che sia una parola chiave in C++. – Arun

+0

Mi dispiace non essere stato chiaro. Il primo blocco di codice è una definizione di proto messaggio. Lasciami chiarire il post. – sivabudh

risposta

10

Google Protobufs non è specificamente destinato ad essere esteso. Ecco un paragrafo dalla documentazione (nel bel mezzo di questo: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):

buffer protocollo e le classi di buffer design Protocollo O-O sono fondamentalmente muti titolari dei dati (come le strutture in C++); non rendono i cittadini di prima classe cittadini in un modello a oggetti. Se si si desidera aggiungere un comportamento più ricco a una classe generata da , il modo migliore per fare consiste nel racchiudere la classe di buffer del protocollo generato in una classe specifica dell'applicazione . ... L'utente non dovrebbe mai aggiungere un comportamento alle classi generate da ereditando da esse le . Questo interromperà i meccanismi interni e non è buono per la pratica orientata agli oggetti .

Riesco a vedere come un simile consiglio sembrerebbe noioso se si volesse un solo metodo, ma in generale è un buon consiglio. Se davvero avete altra funzionalità per giustificare la creazione di una "persona" di classe specifica per l'applicazione, non c'è niente di sbagliato con solo la definizione di una funzione di primo livello:

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