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