2010-10-09 36 views
6

Tôi nên thêm phương thức một thông điệp Protobuf như thế nào?Mở rộng Protobuf bằng các phương pháp của riêng tôi

Giả sử tôi có trong tập tin .proto tôi:

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

và tôi muốn thêm một phương pháp, nói rằng, chuỗi concatenateNameEmail() vào tin nhắn.

Những gì tôi làm ngay bây giờ là tôi có thể tạo riêng ++ lớp C của tôi như thế này:

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

    string concateNateNameEmail() 
    { 
    ... 
    } 
}; 

Vì vậy, nhược điểm là tôi cần phải gọi proto :: Person copy constructor. Có một giải pháp thanh lịch hơn thế này không?

+0

Tôi không nghĩ khối mã đầu tiên chứa " gói "và" message "là cú pháp C++ hợp lệ .. Lý do" package "được đánh dấu cú pháp có lẽ vì nó là một từ khóa trong một số ngôn ngữ, nhưng tôi không nghĩ đó là một từ khóa trong C++. – Arun

+0

Tôi xin lỗi vì tôi không rõ ràng. Khối mã đầu tiên là định nghĩa thông điệp proto. Hãy để tôi xóa bài đăng. – sivabudh

Trả lời

10

Google Protobufs đặc biệt không có ý định mở rộng. Dưới đây là một đoạn văn từ tài liệu (ở giữa này: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html):

Nghị định thư Buffers và các lớp Thiết kế Nghị định thư đệm O-O cơ bản nắm giữ dữ liệu câm (như struct trong C++); họ không tạo ra những công dân hạng nhất trong số các công dân trong một mô hình đối tượng. Nếu bạn muốn thêm hành vi phong phú hơn vào một lớp học được tạo ra , cách tốt nhất để thực hiện điều này là để quấn giao thức được tạo ra lớp đệm trong một lớp học ứng dụng cụ thể . ... Bạn không được thêm hành vi vào các lớp được tạo ra bằng cách kế thừa từ chúng. Điều này sẽ phá vỡ các cơ chế nội bộ và không tốt thực hành hướng đối tượng.

Tôi có thể thấy lời khuyên như thế sẽ gây phiền toái như thế nào nếu bạn chỉ muốn một phương pháp đó, nhưng nói chung đó là lời khuyên khá tốt. Nếu bạn thực sự không có chức năng nào khác để đảm bảo tạo lớp "Người" cụ thể cho ứng dụng, không có gì sai khi chỉ xác định chức năng cấp cao nhất:

string concatenateNameEmail(const proto::Person &person) { ... } 
Các vấn đề liên quan