On Wednesday, 26 December 2012 at 14:38:45 UTC, Nick Treleaven
wrote:
Hi,
Is there an easy way to forward/expose all the constructors of
a parent class? Just curious. Here are my attempts:
class EFoo : Exception
{
//alias typeof(super).this this; // line 12
//alias typeof(super).__ctor __ctor; // line 13
}
uncommenting line 12:
superthis.d(12): Error: identifier expected following '.'
instead of 'this'
superthis.d(12): Error: no identifier for declarator
typeof(super)
superthis.d(12): Error: semicolon expected to close alias
declaration
superthis.d(12): Error: found 'this' when expecting '('
superthis.d(12): Error: basic type expected, not ;
superthis.d(12): Error: found ';' when expecting ')'
superthis.d(17): Error: semicolon expected following function
declaration
Compilation failed.
uncommenting line 13:
superthis.d(13): Error: this is not a type
I've got a mixin to work though:
class EFoo : Exception
{
mixin SuperCtors;
}
mixin template SuperCtors()
{
this(T...)(T args)
if (__traits(compiles, {new typeof(super)(args);}))
{super(args);}
}
But it would be nicer if an alias statement could work to avoid
defining the mixin in every project that needs it.
Partly I'm interested in this as I'm wondering if 'alias this'
conflicts with 'normal' alias syntax when aliasing constructors.
The problem is that Exception class ctor requires at least one
explicit argument
(https://github.com/D-Programming-Language/druntime/blob/master/src/object.di#L339).
To solve the problem in general case you can either supply
default arguments for all ctor parameters or define
parameter-less ctor.
In your particular case because you cannot change Exception you
can inherit not from Exception class but from intermediate one,
which does one of the mentioned things:
import std.stdio;
class DException : Exception
{
this(string value = "") { super(value); }
}
class A : DException
{
}
void main()
{
A a = new A;
}