A lightweight module for class extensions in D
Robert Fraser
fraserofthenight at gmail.com
Fri Dec 5 16:37:29 PST 2008
Gregor Richards wrote:
> I ran into a situation where I needed (essentially) the visitor pattern, but the visitor pattern sucks, so I wanted to make something like class extensions instead (that is, methods added to a class outside of the class definition).
>
> Of course, it's not possible to do this particularly cleanly, but I made a system that works (albeit using gross string mixins). Essentially, if you have a class A, class B : A, class C : B, you could do something like this:
>
> mixin(extensions("A", "void", "doFoo", "", ""));
>
> mixin(extend("A", "doFoo"));
> void A_doFoo(A pthis) {
> /* method for A */
> }
>
> mixin(extend("B", "doFoo"));
> void B_doFoo(B pthis) {
> /* method for B */
> }
>
> Then if you call doFoo(new A()) the call will become A_doFoo(new A()), if you call doFoo(new B()) the call will become B_doFoo(new B()), if you call doFoo(new C()) the call will become B_doFoo(new C()).
>
> If anybody has some improvements, that'd be cool. Maybe you can get rid of the dependence on string mixins ... but I don't think templates quite cut it.
>
> - Gregor Richards
>
Pretty cool stuff, but I don't see how this is at all better than the
visitor pattern. It is not checked at compile-time (so if you forget to
implement one part of the hierarchy, you won't find that out until
runtime) and it's likely less efficient, especially for large enough
hierarchies (i.e. syntax trees). Where's the happy?
More information about the Digitalmars-d
mailing list