struct inheritance
kris
foo at bar.com
Thu Aug 30 19:18:50 PDT 2007
Bill Baxter wrote:
> Robert Fraser wrote:
>> Bill Baxter Wrote:
>>
>>> Let us all turn our copies of WalterAndrei.pdf to page 40 where yea
>>> verily it doth say:
>>>
>>> struct M { int a; }
>>> struct S {
>>> M m;
>>> alias m this;
>>> int b;
>>> }
>>>
>>> Why not just allow mixin to do this?
>>>
>>> struct M { int a; }
>>> struct S {
>>> mixin M;
>>> int b;
>>> }
>>>
>>> That's basically the way it's done now except now it would be more like:
>>> template MMixin() { int a; }
>>> struct M { mixin M; }
>>> struct S { mixin M; int b; }
>>>
>>> Just let us treat a struct like a zero arg template for mixin purposes.
>>>
>>> --bb
>>
>> It amounts to the same thing, so it just depends on which syntax you
>> prefer. Personally, I like...
>>
>> struct S : M { int b; }
>>
>> ... meaning S is non-polymorphically inherited from M. I guess the
>> argument against taht syntax was that it would be confusing for people
>> from a C++ background who assume polymorphic inheritance for structs.
>>
>> Anyways, it's up to Walter to decide on the syntax, and he says "alias
>> this".
>
> I did just think of one issue which is that constructors/opCalls for M
> would be weird. S needs to decide how to initialize the M part, which
> would be difficult if M's constructors are just mixed in directly.
>
> I guess from a compiler-writers perspective "alias this" is more like
> what actually happens when you inherit in typical C++ fashion. In that
> case I guess I'd prefer 'import'
>
> struct M { int a; }
> struct S {
> import M;
> int b;
> }
>
> then you can specify when you need to access the M parts just like you
> do in C++ by M.member.
>
> I'd even prefer "alias m .;" to "alias m this;". It just seems wrong
> and goes against the nice happy view that 'this' is just an implicitly
> defined pointer member.
>
> --bb
Perhaps a bigger problem is this:
# struct M { int a; }
# struct S {
# int b;
# import M;
# }
Now, S is no longer derived from M. Hence, it would seem the right way
to do this is to take it out of the hands of the developer and do
something akin to
# struct S : M
as had been suggested previously. Sure, that particular syntax may mean
something else to some C++ folks, but at least the intent is clear and
the /outcome/ is consistent.
BTW, did you select S&M for a specific reason? :p
More information about the Digitalmars-d
mailing list