On Friday, 19 July 2013 at 06:27:36 UTC, Jacob Carlborg wrote:
On 2013-07-19 00:47, JS wrote:
module main;
import std.stdio;

interface A
{
    final void Afoo() { }
    void bar();
}

class B  : A
{
    final void Bfoo() { }
    void bar() { }
    void doo() { }
}

class C : B
{
    //override void bar() { }
    override void doo() { }
        void doo(int x) { }
}

int main(string[] argv)
{

    pragma(msg, GetOverloadedMethods!B);
    pragma(msg, GetOverloadedMethods!C);

   return 0;
}

GetOverloadedMethods comes from std.traits. It returns toHash, toString,
opCmp, etc...

tuple(bar, doo, toString, toHash, opCmp, opEquals)
tuple(doo, doo, bar, toString, toHash, opCmp, opEquals)

Is there a way to get only the overridden implemented methods?

GetOverloadedMethods!B gives only bar and doo
GetOverloadedMethods!B gives only doo and doo

I would guess it would be possible to get this information using the __traits derivedMembers, parent and getOverloads. Something like:

1. Get all derived members of the class
2. Get all derived members of the parent class
3. Create a tuple with the intersection of the above two lists
4. Filter out any methods that doesn't have the same arguments using getOverloads

Would that work? I guess it would be easier if we had a trait for that.

This depends on what derived members will actually return... I have such a function but haven't looked at the returns;

It would be nice if we had a few more traits. I find it a mess to work with overloads because it seems traits wasn't designed for them. (allMembers does not return overloads)

Reply via email to