Virtual nested classes and "this"
Arafel via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Mar 24 03:44:09 PDT 2017
Hi,
I have been poking around with overriding internal classes, and
after reading [1] it was actually not clear to me whether it
could be done or not, so I started trying.
The good news (for me, at least) is that it can mostly be done
[2], whoever I have found a bit intriguing that I need to
explicitly use "this.i" instead of just "i" in B.fb() [3].
Just in case, the code I got to work is this:
```
class A {
public static class I {
public string fai() {
return "A.I.fai";
}
}
public string fa() {
return i.fai();
}
public this(this C)() {
i_ = new C.I();
}
protected I i_;
public @property T.I i(this T)() { return cast(T.I) this.i_; }
}
class B : A {
override public static class I : A.I {
override public string fai() {
return "B.I.fai";
}
public string fbi() {
return "B.I.fbi";
}
}
public this(this C)() {
super();
}
public string fb() {
return this.i.fbi(); // Why is "this" needed here?
}
}
void main() {
A a = new A();
A ab = new B();
B b = new B();
assert (a.fa() == "A.I.fai");
assert (ab.fa() == "B.I.fai");
assert (b.fa() == "B.I.fai");
assert (b.fb() == "B.I.fbi");
}
```
Is there a reason for that? Why cannot it be inferred as in the
regular case?
Also, if there's a way to do it without using the property
wrapper, I'd be glad to know it :)
I tried something like:
```
template i(this T) {
T.I i;
}
```
but it didn't like it... I guess members have to be better
defined...
Best,
A
[1]:
https://forum.dlang.org/thread/siwjqxiuocqtrldczand@forum.dlang.org
[2]: https://dpaste.dzfl.pl/8f4e0df438e5
[3]: https://dpaste.dzfl.pl/8f4e0df438e5#line-34
More information about the Digitalmars-d-learn
mailing list