November 07, 2011
On Monday, November 07, 2011 05:10:57 Andrej Mitrovic wrote:
> I've had a simple problem where I've only wanted to override a setter from a base class:
> 
> class Foo
> {
>     @property void test(int) {}
>     @property int test() { return 1; }
> }
> 
> class Bar : Foo
> {
>     override @property void test(int) {}
>     void bartest() { auto x = test; }  // NG
> }
> 
> test.d(19): Error: function test.Bar.test (int _param_0) is not
> callable using argument types ()
> 
> So I thought I'd be clever:
> 
> class Foo
> {
>     @property void test(int) {}
>     @property int test() { return 1; }
> }
> 
> class Bar : Foo
> {
>     alias super.test test;
>     override @property void test(int) {}
>     void bartest() { auto x = test; }
> }
> 
> And it actually works! Is this a documented feature?

It has to do with overload sets. I'm pretty sure that it's discussed in the documention. Once you override a base class function in a derived class, the _only_ versions of that function that are in the overload set are the ones in the derived class. If you want the other ones to be in the overload set, you do an alias like you did.

I'm a bit surprised that super.test works. I wouldn't have thought that super would work in that context, but apparently it does (I would have expected you to have to do use Foo.test).

But yes. This is as expected.

- Jonathan M Davis