Build interface from abstract class

DigitalDesigns DigitalDesigns at gmail.com
Tue May 29 20:53:14 UTC 2018


On Tuesday, 29 May 2018 at 20:26:52 UTC, arturg wrote:
> On Tuesday, 29 May 2018 at 19:06:24 UTC, DigitalDesigns wrote:
>> On Monday, 28 May 2018 at 22:15:40 UTC, arturg wrote:
>>> this might help you,
>>> https://dpaste.dzfl.pl/2cf844a11e3f
>>>
>>> you can use them to generate the functions as strings.
>>
>> Thanks,
>>
>> So, the problem I'm having is that I cannot use the generated 
>> interface for the abstract class because the abstract class 
>> needs the interface defined. I need to be able to forward 
>> define the interface then extend it.
>>
>> D doesn't like this
>>
>> main.d(10): Error: interface `main.B` base `A` is forward 
>> referenced
>>
>> interface A;
>> mixin(Generate!(B,A));
>> interface B : A
>> {
>>
>> }
>>
>> abstract class C : B
>> {
>>
>> }
>>
>
> would it work if you define the interface but mixin the members?
>
> interface A
> {
>     mixin(InterfaceFromClass!C);
> }

Yes, I made a post about it but it didn't get through or I forgot 
to send ;/

Doing it this way solves the original problems but creates a new 
problem in that any class that inherits from an abstract class 
that implements A doesn't work.

interface A
{
     mixin(InterfaceFromClass!C);
}

abstract class B : A
{
     A foo() { return this; }
     int bar() { return 3; }
}


class C : B
{
     // compiler says foo, bar not implemented
}


so, instead

interface A
{
     mixin(InterfaceFromClass!C);
}

abstract class B
{
     A foo() { return this; } // requires cast
     int bar() { return 3; }
}


class C : B, A
{

}


works but requires casting this in B which happens to work in C. 
So It is a fessible solution but I'm not sure why the compiler 
things the first case doesn't implement the methods when it 
clearly does. I think it looks at A and doesn't compute the mixin 
first when parsing C because if I put the output of the mixin 
directly it works. Probably a bug...


More information about the Digitalmars-d-learn mailing list