digitalmars.D.learn - Virtual nested classes and "this"
- Arafel (72/72) Mar 24 2017 Hi,
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
Mar 24 2017