On 02/21/2012 04:46 AM, Joshua Reusch wrote:
interface I {
final int foo(I other, int a, int b) {
return other.foo(a,b) + a*b;
}
int foo(int a, int b);
}

class A : I {
int foo(int a, int b) {
return a*b;
}
}

void main() {
A a = new A;

a.foo(5,5);
a.I.foo(a, 5,5);
a.foo(a, 5,5); //line 22
}
---------
$ rdmd interface_final_test
interface_final_test.d(22): Error: function interface_final_test.A.foo
(int a, int b) is not callable using argument types (A,int,int)
interface_final_test.d(22): Error: expected 2 arguments, not 3 for
non-variadic function type int(int a, int b)
---------


Why do I need to write a.I.foo instead of a.foo to call the final method
of the interface ?

Thank you, Joshua


Are you using 2.058? If so, this may be a bad interaction with the newly-added UFCS feature, which I haven't seen working yet. :)

The reason that I think so is that when the 'I other' is moved to a parameter location other than the first one, it works:

interface I {
    final int foo(int a, I other, int b) {// <- second parameter
        return other.foo(a,b) + a*b;
    }
    int foo(int a, int b);
}

class A : I {
    int foo(int a, int b) {
        return a*b;
    }
}

void main() {
    A a = new A;

    a.foo(5,5);
    a.I.foo(5, a, 5);
    a.foo(5,5); //line 22
}

I would say this warrants a bug report. The original code should have worked too.

Ali

Reply via email to