Restriction on interface function types
Frustrated
Frustrated at nowhere.com
Wed Mar 12 12:21:18 PDT 2014
On Wednesday, 12 March 2014 at 10:57:10 UTC, Steve Teale wrote:
> interface I
> {
> auto myType();
> }
>
> class A: I
> {
> auto myType() { return cast(A) null; }
> }
>
> void main()
> {
> I x = getSomeI();
> typeof(x.myType()) y;
> }
Check out:
http://forum.dlang.org/thread/ljqbcbitfptxqjauppte@forum.dlang.org
/ http://dpaste.dzfl.pl/6c90ca418996
It does what you want. As mentioned, you can't quite do this at
compile time because the types must be known(or else just use
object or a void *).
You can, though do this at runtime:
interface I
{
I myType(); // can return anything that derives from I
}
class A : I
{
final A _myType() { return cast(A) null; }
//mixin(AbstractToInterface!(A, I, A)); // (won't work as is
because only return type of myType will be different. Need to use
different names)
// The mixin would create the following function if slightly
modified
I myType() { return _myType; }
}
void main()
{
I x = getSomeI();
typeof(x._myType()) y1;
typeof(x.myType()) y2;
typeof(cast(Object)x.myType()) y;
}
y1 = y2 = I, y = A. (cast(Object) has to do with the weird way D
handles interface types)
Note, that this code works in that if a new class B is created,
it can return it's type:
class B : I
{
final B _myType() { return cast(B) null; }
I myType() { return _myType; }
}
If getSomeI() returns B then y = B.
Of course it's way easier just to do
typeof(cast(Object)x) y; unless you want to potentially return
different objects.
More information about the Digitalmars-d
mailing list