On Tuesday, 14 July 2015 at 17:26:32 UTC, Steven Schveighoffer wrote:
On 7/14/15 11:28 AM, Rene Zwanenburg wrote:
Given the following code:

class Base
{
     alias CallbackType = void delegate(Base);

     CallbackType callback;

     void foo()
     {
         callback(this);
     }
}

class Derived : Base
{

}

void main()
{
     auto d = new Derived();
     d.callback = (Derived d) { /* Do something */ }
}

Obviously this won't compile, since the callback function needs to have Base as parameter, not Derived. But the given code is perfectly safe because in main d typed as Derived, not Base. Does anyone know a clean way to support the code given in main(), preferably by defining some
smart CallbackType so Derived doesn't need to be modified?

No, this isn't possible. Only thing you can do is:

d.callback = (Base b) { if(auto d = cast(Derived)b) { /* Do something */ } else assert(0); };

-Steve

Thanks, I'll have to think of something else then.

At my day job I mostly work with C#, and I strongly dislike how event handler parameters there have to be broader-typed (is that even a valid term?) than they logically need to be, which is why I'm trying to avoid doing something similar here.

Reply via email to