IDEA: An elegant mechanism for adding an interface to sombody else's code

Bill Baxter dnewsgroup at billbaxter.com
Mon Aug 27 13:16:38 PDT 2007


Russell Lewis wrote:
> I was reading through Walter & Andrei's presentation from the D 
> conference and ran across the point that one nice reason for making 
> these two syntaxes equivalent
>     a.func(b);
>     func(a,b);
> is that it allows you to add "member functions" to basic types.
> 
> This gave me an idea for a way to add an interface to a class that 
> didn't declare it originally:
>     interface foo {...};
>     class bar {...};
> 
>     foo foo(bar b)
>     {
>       // generate a temporary wrapper class which implements the
>       // interface and just forwards all calls to b
>       return new bar2foo_Wrapper(b);
>     }
> 
> (I bet that somebody could write a template which would convert any 
> class to any interface, provided that the class implemented the correct 
> functions!)

Someone could, and I believe someone has, to the extent that current 
__traits will allow it.  See Reiner's post in the thread titled "Proxy 
objects and controlling/monitoring access".  digitalmars.D:57033

> Then, anywhere in the code, you could access the "interface" as:
>     bar b = new bar;
>     foo f = b.foo;
> 
> ...which, of course, implies that perhaps that should be the (or a) 
> standard way to access Interfaces, instead of casts:
>     interface fred {...}
>     class wilma : fred {...}
> 
>     wilma w = new wilma;
>     fred  f = w.fred;
> 
> Thoughts?

I'm in the camp that thinks cast should mean 'watch out I'm doing 
something potentially dangerous!'  And dynamic_casts like that aren't 
dangerous.  So yeh, I'd like to see some syntax besides cast for that.

--bb



More information about the Digitalmars-d mailing list