Build interface from abstract class

Simen Kjærås simen.kjaras at gmail.com
Mon May 28 11:51:20 UTC 2018


On Monday, 28 May 2018 at 09:59:50 UTC, DigitalDesigns wrote:
> Implementing interfaces can be a pain but are necessary.
>
> I like to use abstract classes and provide a base 
> implementation. It would be cool if I could use D's awesome 
> meta features to extract the interface from the abstract class 
> then build it. This requires some funky stuff which I'm not 
> sure D can do

Creating an interface based on a class is no big deal in D:

interface Interface(T)
{
     import std.traits;
     static foreach (fn; __traits(allMembers, T))
         static foreach (overload; MemberFunctionsTuple!(T, fn))
             mixin("ReturnType!overload 
"~fn~"(Parameters!overload);");
}

class A
{
    void fun() {}
}

alias IA = Interface!A;

However, you run into a problem when A is expected to implement 
IA: in order to figure out which functions should be in the 
interface, we need to know which functions are in A. And in order 
to figure out which functions are in A, we need to know which 
functions are in IA. It's a loop with no real solution.

In this specific case, one could consider only members of A, 
ignoring any interfaces or base classes. This isn't currently 
possible, but it's not an entirely unreasonable enhancement 
request.

--
   Simen


More information about the Digitalmars-d-learn mailing list