Re: list member containing sub classes

2009-08-05 Thread Kenton Varda
Why do your protocol message types have to map 1:1 with your legacy classes?
 Generally, attempting to map inheritance onto Protocol Buffers doesn't work
very well.
You are right that you can use extensions, but unless you have a large
number of subclasses of OParameter, this isn't helpful.  If the only
subclasses of OParameter are OStringParameter, OLongParameter, and
OListParameter, then I highly recommend defining OParameter as:

  message OParameter {
// Only one of the following will be filled in.
optional int64 long_value = 1;
optional string string_value = 2;
repeated OParameter list_value = 3;
  }

If you really wanted to use extensions instead, you could do:

  message OParameter {
// Only one extension will be filled in.
extensions 1 to max;
  }

  extend OParameter {
optional int64 oparameter_long_value = 1;
optional string oparameter_string_value = 2;
repeated OParameter oparameter_list_value = 3;
  }

This is logically equivalent to the first definition.  The only difference
is logistical:  you can define each extension field in a different .proto
file, and your program only needs to compile in the definitions of
extensions that it actually uses.  So you can do:

  // oparameter.proto
  message OParameter {
// Only one extension will be filled in.
extensions 1 to max;
  }

  // olongparameter.proto
  import "oparameter.proto";
  extend OParameter {
optional int64 oparameter_long_value = 1;
  }

  // ostringparameter.proto
  import "oparameter.proto";
  extend OParameter {
optional string oparameter_string_value = 2;
  }

  // olistparameter.proto
  import "oparameter.proto";
  extend OParameter {
repeated OParameter oparameter_list_value = 3;
  }

But again, if you only have these three subclasses, then this is overkill.
 If you actually have a lot more (say, at least 10), then it might be
worthwhile.

Again, keep in mind that extensions are not inheritance -- they are a very
different concept which happens to be able to solve similar problems.

On Wed, Aug 5, 2009 at 1:31 AM, Tai  wrote:

>
> Hi Kenton,
>
> Sorry the parameter classes are legacy code and persisted to the DB as
> well. So I have to figure out what's the best approach defining my
> proto classes.
>
> What I see is that there is the way of using extensions in the proto
> files. As far as I understand it is an extension of members (an not
> classes) in another proto file. Correct?
>
> So in my case the files in OStringParameterMessage.proto and
> OLongParameterMessage.proto extends OParameterMessage.proto with a
> member "value" of type string and int64.
>
> The OListParameterMessage.proto then extends it with a member value of
> type List (containing OParameterMessage.OParameter instances).
>
> In the OListParameter.writeObject() I build OParameter messages. But
> wouldn't there be a problem since the value is either of type String
> or Quantity (depending on the subclass of OParameter)? Probably I have
> to define different member names.
>
> Tai
>
>
> On 5 Aug., 03:05, Kenton Varda  wrote:
> > Can you just have the OParameter message contain optional fields of type
> > string and int64, where only one of the two is ever set?  Then don't have
> > specific types corresponding to OStringParameter and OLongParameter.
> >
> > On Tue, Aug 4, 2009 at 5:07 PM, Tai  wrote:
> >
> > > Hi,
> >
> > > I have an (abstract) class:
> > > - OParameter with a member String key
> >
> > > Now there are also two subclasses of OParameter:
> > > - OStringParameter with a member String value
> > > - OLongParameter with a member long value
> >
> > > By using Protocol Buffers I define the proto files:
> > > - OParameterMessage.proto
> > > - OStringParameterMessage.proto
> > > - OLongParameterMessage.proto
> >
> > > The files are independent from each other (no extension is used). As
> > > far as I understand this is how Protocol Buffers should be used. All
> > > classes (OParameter, OStringParameter and OLongParameter) then
> > > implements the writeObject() and readObject() and each class just uses
> > > their Protocol message and sets their members. Like:
> > > - Class OStringParameter.writeObject() builds a message and sets only
> > > its member (value)
> > > - The superclass OParameter.writeObject() builds a message and sets
> > > only its member (key)
> >
> > > The same goes for the readObject().
> >
> > > Okay. So far so good. But now I have a class called OListParameter and
> > > its member (value) is a list of OParameter containing instances of
> > > both types: OStringParameter and OLongParameter.
> >
> > > How do I describe this in a proto file?
> >
> > > Thanks Tai
> >
>

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to protobuf@googlegroups.com
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com
For more options, v

Re: list member containing sub classes

2009-08-05 Thread Tai

Hi Kenton,

Sorry the parameter classes are legacy code and persisted to the DB as
well. So I have to figure out what's the best approach defining my
proto classes.

What I see is that there is the way of using extensions in the proto
files. As far as I understand it is an extension of members (an not
classes) in another proto file. Correct?

So in my case the files in OStringParameterMessage.proto and
OLongParameterMessage.proto extends OParameterMessage.proto with a
member "value" of type string and int64.

The OListParameterMessage.proto then extends it with a member value of
type List (containing OParameterMessage.OParameter instances).

In the OListParameter.writeObject() I build OParameter messages. But
wouldn't there be a problem since the value is either of type String
or Quantity (depending on the subclass of OParameter)? Probably I have
to define different member names.

Tai


On 5 Aug., 03:05, Kenton Varda  wrote:
> Can you just have the OParameter message contain optional fields of type
> string and int64, where only one of the two is ever set?  Then don't have
> specific types corresponding to OStringParameter and OLongParameter.
>
> On Tue, Aug 4, 2009 at 5:07 PM, Tai  wrote:
>
> > Hi,
>
> > I have an (abstract) class:
> > - OParameter with a member String key
>
> > Now there are also two subclasses of OParameter:
> > - OStringParameter with a member String value
> > - OLongParameter with a member long value
>
> > By using Protocol Buffers I define the proto files:
> > - OParameterMessage.proto
> > - OStringParameterMessage.proto
> > - OLongParameterMessage.proto
>
> > The files are independent from each other (no extension is used). As
> > far as I understand this is how Protocol Buffers should be used. All
> > classes (OParameter, OStringParameter and OLongParameter) then
> > implements the writeObject() and readObject() and each class just uses
> > their Protocol message and sets their members. Like:
> > - Class OStringParameter.writeObject() builds a message and sets only
> > its member (value)
> > - The superclass OParameter.writeObject() builds a message and sets
> > only its member (key)
>
> > The same goes for the readObject().
>
> > Okay. So far so good. But now I have a class called OListParameter and
> > its member (value) is a list of OParameter containing instances of
> > both types: OStringParameter and OLongParameter.
>
> > How do I describe this in a proto file?
>
> > Thanks Tai
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to protobuf@googlegroups.com
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en
-~--~~~~--~~--~--~---



Re: list member containing sub classes

2009-08-04 Thread Kenton Varda
Can you just have the OParameter message contain optional fields of type
string and int64, where only one of the two is ever set?  Then don't have
specific types corresponding to OStringParameter and OLongParameter.

On Tue, Aug 4, 2009 at 5:07 PM, Tai  wrote:

>
> Hi,
>
> I have an (abstract) class:
> - OParameter with a member String key
>
> Now there are also two subclasses of OParameter:
> - OStringParameter with a member String value
> - OLongParameter with a member long value
>
> By using Protocol Buffers I define the proto files:
> - OParameterMessage.proto
> - OStringParameterMessage.proto
> - OLongParameterMessage.proto
>
> The files are independent from each other (no extension is used). As
> far as I understand this is how Protocol Buffers should be used. All
> classes (OParameter, OStringParameter and OLongParameter) then
> implements the writeObject() and readObject() and each class just uses
> their Protocol message and sets their members. Like:
> - Class OStringParameter.writeObject() builds a message and sets only
> its member (value)
> - The superclass OParameter.writeObject() builds a message and sets
> only its member (key)
>
> The same goes for the readObject().
>
> Okay. So far so good. But now I have a class called OListParameter and
> its member (value) is a list of OParameter containing instances of
> both types: OStringParameter and OLongParameter.
>
> How do I describe this in a proto file?
>
> Thanks Tai
> >
>

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to protobuf@googlegroups.com
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en
-~--~~~~--~~--~--~---



list member containing sub classes

2009-08-04 Thread Tai

Hi,

I have an (abstract) class:
- OParameter with a member String key

Now there are also two subclasses of OParameter:
- OStringParameter with a member String value
- OLongParameter with a member long value

By using Protocol Buffers I define the proto files:
- OParameterMessage.proto
- OStringParameterMessage.proto
- OLongParameterMessage.proto

The files are independent from each other (no extension is used). As
far as I understand this is how Protocol Buffers should be used. All
classes (OParameter, OStringParameter and OLongParameter) then
implements the writeObject() and readObject() and each class just uses
their Protocol message and sets their members. Like:
- Class OStringParameter.writeObject() builds a message and sets only
its member (value)
- The superclass OParameter.writeObject() builds a message and sets
only its member (key)

The same goes for the readObject().

Okay. So far so good. But now I have a class called OListParameter and
its member (value) is a list of OParameter containing instances of
both types: OStringParameter and OLongParameter.

How do I describe this in a proto file?

Thanks Tai
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to protobuf@googlegroups.com
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en
-~--~~~~--~~--~--~---