struct subtyping?

spir denis.spir at gmail.com
Sun Oct 24 16:11:14 PDT 2010


On Sun, 24 Oct 2010 23:41:07 +0200
"Simen kjaeraas" <simen.kjaras at gmail.com> wrote:

> spir <denis.spir at gmail.com> wrote:
> 
> > I would like to learn about possible workarounds, or other alternative  
> > approaches to such problems, if ever you now any.
> 
> Basically, you probably want to use alias this:
> 
> http://digitalmars.com/d/2.0/class.html#AliasThis
> 
> It lets you subtype structs by propagating member field/function access
> to a member, if the struct or class does not implement the field or
> function itself.

All right, if I understand correctly, this is very similar to Lua metatables. (The __index field of an object's metatable tells what to do when slot lookup fails.) If I'm right, this would allow type extension by storing additional fields/methods on a kind of sub-struct? (But not method overriding, I guess; which anyway would require type-bound method dispatch).
I also considered having a void* field where type-specific slots would be stored. Or unions (but I don't know how they work actually). Alias this seems better since lookup mechanism would be "automagic", if I understand correctly.

> alias this is panacea - if a function expects a base struct, and returns
> it after doing some alterations, you cannot cast the result to a subtype
> (see below).

Do you mean "alias this _not_ is panacea"?

> > Also, I would love to read about the rationale for _not_ having struct  
> > type hierarchies (probably this would not be a big deal, since D has it  
> > for classes (*)) Or maybe I have simply not correctly understood  
> > available docs?
> 
> The main reason is the slicing problem. If the language lets a user store
> a struct that is a subtype of another struct, and that adds fields, in a
> location where space is only allocated for the base struct, the extra
> fields are eaten by grues, and bugs appear.

All right, thank you! (This is also the reason why Oberon prohibits returning from funcs dynamic arrays and record: their size is not known at compile-time -- the latter because they can be extended/subtyped. So that we need to use pointers).

Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com



More information about the Digitalmars-d-learn mailing list