struct mixins

Leandro Lucarella llucax at gmail.com
Mon Nov 16 07:32:31 PST 2009


struct inheritance never make it into D, for a good reason: structs are
not supposed to be polymorphic and inheritance is very tied to
polymorphism. But struct inheritance is sometimes very useful for
"composition", avoid an extra member when accessing to the composed type
members.

Example:

struct A {
	int x;
	int y;
}

struct B {
	A a;
	int z;
}

B b;
b.a.x = 5;

A way to "fix" this is using template mixins:

template Common() {
	int x;
	int y;
}

struct A {
	mixin Common;
}

struct B {
	mixin Common;
	int z;
}

B b;
b.x = 5;

But one can think this is even worse than the previous approach :)

What if one could use a struct directly with mixin?

struct A {
	int x;
	int y;
}

struct B {
	mixin A;
	int z;
}

B b;
b.x = 5;


I think this is nice, looks good, is backwards compatible, it might be
easy to implement (not sure about that though) and can be even extended to
classes (not sure about the usefulness of that either).

The only problem are name collisions, but that can already happen with
template mixins, right? Anyway, collisions can yield a compile error, or
they might be accepted, requiring the full qualified name to access the
attribute, like with classes and inheritance (you can't do a mixin of the
same struct twice). Say A is updated in the future:

struct A {
	int x;
	int y;
	int z;
}

b.z = 1; // changes B.z
// to modify B.A.z:
b.A.z = 1;


I think collisions should be very rare anyways in structs.

PS: For those who wonder, yes, this is inspired in the "embedding" feature
    of Google's Go, which is basically a mixin, but without adding
    template to the mix, it's just this, struct mixins.


-- 
Leandro Lucarella (AKA luca)                     http://llucax.com.ar/
----------------------------------------------------------------------
GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145  104C 949E BFB6 5F5A 8D05)
----------------------------------------------------------------------
El techo de mi cuarto lleno de universos



More information about the Digitalmars-d mailing list