Is this actually valid code?

Jonathan M Davis jmdavisProg at gmx.com
Sun Nov 6 20:21:24 PST 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


More information about the Digitalmars-d-learn mailing list