Why do they "belong" on the same level? Does containment prevent you from
Post by Saurabh KumarSorry about that. I had written 'personal preference' because I thought it
is hard to convey why I have to do it.
I think simplest way to convey would be, there is one proto definition say
commonmsg.proto. I do not own this and can not make any changes to this.
Now I want to define many messages (that I own) and have some additional
optional/required parameters and common ones from commonmsg.proto. So the
message MSG { required string account = 1; required string symbol = 2;
optional Extra1 extra1 = 3; optional Extra2 extra2 = 4; message Extra1 {
required int32 id = 1; } message Extra2 { required string foo = 1; } }
Nesting (containing) is not what I want, because the nature of fields is
such that it does not make much sense. All of them belong to same level.
I guess it might still not make sense to you, but you know what I am
looking for and it could be a hack :)
I know exactly what you're trying to achieve, but you haven't presented a
strong case for why you want this. Both the approaches I've suggested avoid
the copy pasting you're worried about, and personal preference isn't an
argument.
Hi,
Thanks for the suggestions below. I agree with you that these approaches
address most of the real life scenarios. What I am really looking for is
more of a syntactic sugar. In my case, I want to avoid any kind of nesting
as a personal preference. I just want to avoid copy pasting same members at
multiple places and have the overhead of keeping them updated everywhere.
I don't even mind if we had a certain kind of preprocessor to achieve this
i.e.
#define common_fields required int32 a; \
required int32 b; \
message msg1 {
common_fields;
required int32 c;
}
message msg2 {
common_fields;
required int32 d;
}
Does it make sense?
It probably wouldnât be difficult to implement, but itâs not, afaik, a
design goal for protocol buffers because it is almost never (if ever)
necessary.
There are two composition approaches available, depending on what your
message Common {
required string account = 1;
required string symbol = 2;
}
message MSG1 {
required common = 1
}
message MSG2 {
required common = 1
required int32 id = 2;
}
message MSG {
required string account = 1;
required string symbol = 2;
optional Extra1 extra1 = 3;
optional Extra2 extra2 = 4;
message Extra1 {
required int32 id = 1;
}
message Extra2 {
required string foo = 1;
}
}
message MSG {
string account = 1;
string symbol = 2;
oneof extra { Extra1 extra1 = 3; Extra2 extra2 = 4;
}
message Extra1 {
int32 id = 1;
}
message Extra2 {
string foo = 1;
}
}
If composition is not what you want, then why not? What real-world problem
do you have that cannot be effectively solved with one of the above
strategies?
Understood but this is not what I wanted in the first place.
Does someone has any idea about what makes it difficult to implement this?
Also, is there a clever way to have the same behaviour?
Basically, here I want to avoid copy pasting same fields over and over
again (makes code less maintainable).
Any ideas are welcome.
message Header {
string account = 1;
string symbol = 1;
}
message Msg1 {
Header header = 1;
...
}
message Msg2 {
Header header = 1;
...
}
Thanks for the reply. What exactly do you mean by common header?
Hi,
This question is regarding inheritance in protobuf C++ library. I will
explain what I am looking for with a concrete example.
message MSG1
{
required string account = 0;
required string symbol = 1;
}
message MSG2
{
required string account = 0;
required string symbol = 1;
required int32 id = 2;
}
You will notice that first two fields of MSG2 are exactly same as MSG1
(they are intended to be like that). But here I had to copy paste the
common fields again.
Can I do something like this?
message MSG2 extends MSG1
{
required int32 id = 2;
}
message MSG2
{
required MSG1 msg1 = 0;
required int32 id = 2;
}
But this is not really what I want.
What's the best way to achieve this?
Protobuf doesn't support inheritance. Having a common header and using
composition is the best solution.
Thanks,
Saurabh
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.
â
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.