digitalmars.D.learn - alias this for inheritance
- spir (62/62) Feb 23 2011 Hello,
- Steven Schveighoffer (21/26) Feb 23 2011 It allows *some* simulation of inheritance. However, it does not
Hello, I have read several times that alias this is a way to implement inheritance for structs. I am simply unable to imagine how to use this feature that way. Has anyone an example? As I understand it, alias this constructs a proxy that delegates some or all of of its behaviour to its 'alias' member. Full stop. How, from this, can one construct for instance such a minimalistic subtyping hierarchy --and make it work as expected: struct S { bool b; } struct SI { bool b; int i; void write () { writeln("int: ", this.i); } } struct SF { bool b; float f; void write () { writeln("float: ", this.f); } } unittest { auto si = SI(true, 1); si.write(); auto sf = SF(false, 1.1); sf.write(); // challenge: S[2] a; a[0] = si; a[1] = sf; foreach (s ; a) s.write(); } The equivalent using class subtyping would be trivial (indeed): class C { bool b; void write() {}; } class CI : C { int i; this (int i) { this.i = i; } override void write () { writeln("int: ", this.i); } } class CF : C { float f; this (float f) { this.f = f; } override void write () { writeln("float: ", this.f); } } unittest { auto ci = new CI(1); ci.write(); auto cf = new CF(1.1); cf.write(); // works: C[2] a; a[0] = ci; a[1] = cf; foreach (c ; a) c.write(); } Help welcome, thank you, Denis -- _________________ vita es estrany spir.wikidot.com
Feb 23 2011
On Wed, 23 Feb 2011 10:34:04 -0500, spir <denis.spir gmail.com> wrote:Hello, I have read several times that alias this is a way to implement inheritance for structs. I am simply unable to imagine how to use this feature that way. Has anyone an example?It allows *some* simulation of inheritance. However, it does not implement polymorphism. What it does is allow specialization and upcasts. For example: struct S { int x; void foo() {} } struct T { S s; void foo2() {}; int y; alias s this; } T t; t.foo(); // translates to t.s.foo(); t.x = 5; // translates to t.s.x = 5; S s = t; // translates to S s = t.s; -Steve
Feb 23 2011