Thread overview
Interface wierdness
May 07, 2022
Ruby The Roobster
May 07, 2022
Ruby The Roobster
May 07, 2022
Salih Dincer
May 07, 2022

Define an interface that has a function that returns an object of the same type:

interface I
{
    I foo();
}

Now define a class that inherits that interface:

class M : I
{
    this(int i)
    {
        this.i = i;
    }
    M foo()
    {
        return new M(42);
    }
    int i;
}

Given this example, the following main function fails to compile:

void main()
{
    M m = new M(3);
    M c = m.foo();
    import std.stdio;
    writeln(c.i);
}

The error message is the following:

Error: need `this` for `foo` of type `M()`

Why does this happen and how to fix it?

May 07, 2022

On Saturday, 7 May 2022 at 00:48:20 UTC, Ruby The Roobster wrote:

>

Define an interface that has a function that returns an object of the same type:
..
Nevermind. I was being stupid and made a naming error.

May 07, 2022

On Saturday, 7 May 2022 at 00:48:20 UTC, Ruby The Roobster wrote:

>

Why does this happen and how to fix it?

What version compiler are you using? I've tried it in two different versions (one is the newest), it works:

import std;
interface I
{
    I foo();
}
class M : I
{
    this(int i)
    {
        this.i = i;
    }
    M foo()
    {
        return new M(42);
    }
    int i;
}
void main()
{
    M m = new M(3);
    m.i.writeln("(m.i)");
    M c = m.foo();
    c.i.writeln("(c.i)");
}/*Printouts:
3(m.i)
42(c.i)

Process finished.
*/