passing subclass to superclass where parameter is a delegate for the superclass

Alex sascha.orlov at gmail.com
Wed Nov 14 16:39:52 UTC 2018


On Wednesday, 14 November 2018 at 16:06:21 UTC, Chris Bare wrote:
> If I have:
> class base
> {
>     void delegate(base) stored_dg;
>
>     void
>     add_function (void delegate (base) dlg)
>     {
>         stored_dg = dlg;
>     }
> }
>
> class A : base
> {
>     this ()
>     {
>         super ();
>         add_function (&this.foo);
>     }
>
>     void foo (A a)
>     {
>         log ("i got here");
>     }
> }
>
> it fails because foo(A) does not match the parameter type of 
> delegate(base)
>
> If I change foo (A a) to foo (base a)
>
> It works, but this could be awkward in a deeper class hierarchy 
> where you
> might not know the class name to use.
>
> Is there a way to do this where foo's parameter type does not 
> to match the
> class that implements add_function?
>
> Thanks,
> Chris

Are you looking for this?
https://dlang.org/phobos/std_traits.html#TransitiveBaseTypeTuple

It matches however not exactly your needs:
As all objects are derived from the Object class, you will always 
get it as the common parent. So... with the trait, you get a list 
but have still to make a decision which type to use.


More information about the Digitalmars-d-learn mailing list