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.