Signals far from Slots
Jim Hewes via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun May 4 10:57:29 PDT 2014
Is there a good way to connect signals and slots when the objects are
far apart? All tutorials for signals and slots show the objects being
readily accessible by the main() function. But what if they're not? Is
there an elegant design?
For example, here's a typical minimal demo:
---------------------------------------------------------
class Foo
{
void Listen()
{
writeln("Foo: I hear you!");
}
}
class Bar
{
mixin Signal!() barSignal;
void SaySomething()
{ emit(); }
}
int main(string[] argv)
{
Foo f = new Foo();
Bar b = new Bar();
b.barSignal.connect(&f.Listen);
b.SaySomething();
return 0;
}
---------------------------------------------------------------
The main() function is a kind of controller that connects up the
components. But let's say main() doesn't have access to Bar because it's
behind a layer:
------------------------------------------------------------------
class BarContainer
{
this() { b = new Bar(); }
void SetBarSignalHandler(b.barSignal.slot_t dg)
{ b.barSignal.connect(dg); }
private Bar b;
};
int main(string[] argv)
{
Foo f = new Foo();
BarContainer bc = new BarContainer();
bc.SetBarSignalHandler(&f.Listen);
return 0;
}
------------------------------------------------------------------
This can get worse if there is also a FooContainer and objects get
further away.
My first thought is to pass the delegates through the layers, as in the
SetBarSignalHandler() function in BarContainer. But this seems kind of
ugly as all the layers need to know about the connection between the
signaling object and the observer object. It would be nice if they
didn't have to.
Do you know any any cleaner way?
Jim
More information about the Digitalmars-d-learn
mailing list