Making containers that "go both ways"

janderson askme at me.com
Sat Jan 26 11:10:56 PST 2008


Bill Baxter wrote:
 > janderson wrote:
 >> Bill Baxter wrote:
 >>  > Hey,
 >>  > Just wanted to throw this idea out for comment.
 >>  > I find I can't really decide whether a container class should be 
a struct or a class.  Struct feels right if I want minimal overhead and 
something that works more like a built-in datatype.  But class feels 
right for situations where I'm less concerned about performance
 >>
 >>
 >> Personally I'd make it a class.  Yes its going to go on the heap 
however the resizeable array part or whatever the container contains, 
will probably go on the heap anyway.
 >>
 >> , and
 >>  > also offers the additional ability to extend the basic 
functionality via subclassing.
 >>
 >> I think you should avoid thinking about subclassing like this. 
Using mixins or components is a much better idea then subclassing. 
Subclassing should normally be used for polymorphism.
 >
 > Yeh, I don't actually ever do that myself, but I hear that some 
people do, at least in other languages.  That's why I mentioned it. 
Anyway, if I subclass Container to attach some additional info it, or do 
something slightly different, but still pass it to the original 
Container-using code how would that that not constitute subclassing for 
polymorphism?

Polymorphism has to do with virtual functions.  You change the 
definition of the object.  Its better to do:

class Container {}

class A
{
     Container C;
}

then

class A : public Container
{

}

In the case of a container you probably don't want to change it's shape. 
  That is of course unless your writing something like a C# control 
container.


 >
 > But it's strange you say "make it a class" and then turn around and 
say "but don't use the main property of classes that distinguish them 
from structs".  If you want to discourage subclassing of containers, 
what could be better than making them structs so that it's actually 
impossible?
 >
 >
 >>  > So something I did (a while back now...) was to create some 
containers in OpenMesh/D that use mixins for all their guts, and provide 
both struct and class wrappers for them.
 >>  >
 >>  > It seems to me like that might be the "right" way to do 
containers in D. Somewhat unfortunately, because it's more complicated 
than just writing one or the other.
 >
 >> This may help:
 >> http://www.artima.com/intv/goldilocks3.html
 >
 > Not really.  He's talking about C++, where classes and structs are 
the same thing.
 > """
 > Bjarne Stroustrup: My rule of thumb is that you should have a real 
class with an interface and a hidden representation if and only if you 
can consider an invariant for the class.
 > """
 > The distinction he's making is between making everything public vs 
having private data members with API functions to do all the 
manipulation.  That choice applies equally to either structs or classes 
in D.
 >
 > --bb




More information about the Digitalmars-d mailing list