DIP66 - Multiple alias this

IgorStepanov via Digitalmars-d digitalmars-d at puremagic.com
Tue Oct 28 11:09:41 PDT 2014


On Tuesday, 28 October 2014 at 02:07:23 UTC, Andrei Alexandrescu 
wrote:
> On 10/24/14 6:05 AM, IgorStepanov wrote:
>> On Friday, 24 October 2014 at 06:04:24 UTC, Andrei 
>> Alexandrescu wrote:
>>> On 10/19/14 2:00 PM, IgorStepanov wrote:
>>>> Bump.
>>>
>>> I've made a few grammar and fluency edits to the DIP, and 
>>> collected a
>>> few thoughts while doing that. Will get back on this before 
>>> too long.
>>> -- Andrei
>>
>> I've seen it. Thanks!
>> Waiting for a comments.
>
> Coming soon. I've been under quite a bit of pressure as of late.
>
>> Should I add chapter about method overloading with alias this: 
>> it should
>> work (and works) as cross-module overloading. It should imply
>> This implies from the DIP but hasn't written explicitly.
>
> Interesting. I think it should work like overloading of calls 
> in base and derived classes.

Not really. Rules which define overloading class methods doesn't 
describe multiple inheritance case.
In single inheritance case alias this rule is similar with 
inheritance rule: derived overload set hides base base overload 
set:

struct A
{
     void foo(string)
     {
         writeln("string");
     }

     void foo(int)
     {
         writeln("int");
     }
}

struct B
{
     void foo(double)
     {
         writeln("double");
     }

     A a;
     alias a this;
}

B b;
b.foo("string"); //error
b.foo(42); //called B.foo(double), not B.a.foo(int);

The second test is not similar to inherintance rules, but this 
case is not relevant with multiple alias this and it is already 
done.

When I said "cross-module overloading", I told about case when C 
inherits (via alias this) A and B, both A and B have "foo" 
methods with different paramethers and compiler should resolve 
foo call:

struct A
{
     void foo(string)
     {
         writeln("string");
     }

     void foo(int)
     {
         writeln("int");
     }
}


struct B
{
     void foo(double)
     {
         writeln("double");
     }
}

struct C
{
      A a;
      B b;
      alias a this;
      alias b this;
}

C c;
c.foo("str"); // OK, c.a.foo(string)
c.foo(4.2); //OK, c.b.foo(double);
c.foo(42); //Error: c.a.foo(int) or c.b.foo(double)?

BTW, similar case with multiple inheritance via interfaces works 
absolutely incorrect:

interface CA
{
     final void foo(string)
     {
         writeln("string");
     }

     final void foo(int)
     {
         writeln("int");
     }
}

interface CB
{
      final void foo(double)
      {
          writeln("double");
      }
}

class CC : CA, CB
{

}

auto cc = new CC();
cc.foo("xxx"); //OK, called CA.foo(string)
cc.foo(42); //called CA.foo(int) without any warnings
cc.foo(4.2); //Error: unable to call CA.foo with double argument.

In other words, compiler choses the first base interface, uses 
its overload set and ignores other interfaces.

>> OT: Should `et\s?c\.?` be written as "etc" in English?
>> I thought that it should be written as "et c.", because "et 
>> cetera". Or
>> is it an anachronism?
>
> You can't go wrong with M-W: 
> http://www.merriam-webster.com/dictionary/etc

Thanks.


More information about the Digitalmars-d mailing list