Andrei Alexandrescu wrote:
> On 3/15/11 1:54 PM, Jens wrote:
>> Jesse Phillips wrote:
>>> Jens Wrote:
>>>
>>>> OK, silly me. I used a wrong example. I really did want to know
>>>> about non-polymorphic composition from structs via derivation.
>>>> Sorry for the confusion.
>>>>
>>>> struct point
>>>> {
>>>>      int x;
>>>>      int y;
>>>> };
>>>>
>>>> struct point3d: point
>>>> {
>>>>      int z;
>>>> };
>>>
>>> You already got your answer 'alias this' which you have dismissed as
>>> ugly. You wanted composition and I think it provides a very clean
>>> way to describe composition, especially since it looks nothing like
>>> how inheritance of classes which have polymorphic behavior.
>>
>> Inheritance and polymorphic behavior can be (should be IMO)
>> orthogonal.
>
> In concept it's easy to abide to strong stances, and I wouldn't
> disagree it's not half a bad thing. However, real-world issues do
> arise.

And all those xxx-ability words apply. Such as useability, 
comprehensibility, learnability.. etc. There is technical "correctness" 
and then there is "the good thing".

>
> Inheritance is often a desirable mechanism for implementing dynamic
> polymorphism for two main reasons. One, it prevents accidental
> polymorphism from happening. Two, it allows the compiler to lay out
> objects efficiently and make function invocation relatively fast
> without a need for global information. Offhand I don't think there
> are other reasons.
>
> Inheritance without polymorphism is technically possible, but rarely
> of any practical interest.

Yeah, jettison clean syntax because it's of little importance. :/

> In C++, next to nobody uses private
> inheritance systematically, and nobody really understands what
> protected inheritance really is.
>

I avoid private inheritance and never used protected inheritance. I use 
composition in those cases but that is when B. Meyer's books come of the 
shelf for a reread. I was originally talking just about structural 
extension (I probably said "composition" but "extension" is a tad better 
term) via inheritance syntax. "inheritance" isn't the key thought in all 
of that. "extension" and "syntax" are.

> Polymorphism without inheritance is the election mechanism during
> compilation, and possible for runtime polymorphism with
> well-understood reflection mechanisms (btw I see now that adaptTo has
> not been yet added to std.typecons...)
>
> All in all inheritance is strongly associated with polymorphism as it
> is a basic mechanism for implementing it, so it would be tenuous to
> force the two to be orthogonal.

"orthogonal" is a bit strong, but I left it in. Let's face it, when you 
derive, you get data members and methods. In a struct with no methods, 
you get data members only, in a nice clean way. I find that compelling, 
syntax-wise.

>
>>> Also note the
>>> intent is to allow for multiple 'alias this' declarations, but
>>> hasn't yet been implemented.
>>>
>>> struct point
>>> {
>>>      int x;
>>>      int y;
>>> };
>>>
>>> struct point3d
>>> {
>>>      point p; // I own a point
>>>      alias this p;  // I am a composition of a point p.
>>>      int z;
>>> };
>>
>> I didn't ask how to do composition in D. I asked why composition
>> cannot be done via derivation, i.e., the reasoning behind the
>> language design choice. A design faux paus IMO.
>
> I would agree, with the slight amendment that this time for once the
> faux pas is in the design of the application, not that of the
> language.

We'll have to agree to disagree on this one then. I'm sure there will be 
others. ;) 


Reply via email to