2011-01-20 36 views
8

Có thể sử dụng protobuf với các lớp học kế thừa không?protobuf có thừa kế?

tôi muốn làm một cái gì đó như thế này

class Expr; 
class AddExpr : Expr; 
class CallFunc: Expr; 

class FunctionBody{ 
    repeatable Expr expr; 
} 
+0

Có thể tìm thấy một cuộc thảo luận hay trong bài đăng trên blog này: http://www.indelible.org/ink/protobuf-polymorphism/ – earcam

Trả lời

10

Không trong việc thực hiện cốt lõi - bạn sẽ muốn sử dụng đóng gói để thay thế.

Tuy nhiên nếu bạn đang sử dụng chỉprotobuf-net, như mã đầu tiên, tôi hack xung quanh nó:

[ProtoInclude(1, typeof(AddExpr))] 
[ProtoInclude(2, typeof(CallFunc))] 
[ProtoContract] 
class Expr {} 

[ProtoContract] 
class AddExpr : Expr {} 
[ProtoContract] 
class CallFunc: Expr {} 

[ProtoContract] 
class FunctionBody{ 
    private List<Expr> expressions; 
    [ProtoMember(1)] 
    public List<Expr> Expressions { 
     get { return expressions ?? (expressions = new List<Expr>()); } 
    } 
} 

Tất nhiên, tôi giả sử có một số chi tiết bổ sung trong các lớp - "nguyên trạng "bạn chỉ có thể sử dụng một enum (trong đó được hỗ trợ tốt).