Suggestion: signal/slot mechanism

Serg Kovrov kovrov at no.spam
Thu Sep 7 02:50:27 PDT 2006


The approach (simplified), I currently use:

> class Foo
> {
> 	enum EV {VAL_CHANGED,}
> 	void emit(EV ev) {
> 		auto fn = ev in subscribers;
> 		try { if (fn != null) (*fn)(); }
> 		catch (Exception wtf) { writefln("WTF? %s", wtf); }
> 	}
> 	void sub(EV ev, void delegate() fn) {
> 		subscribers[ev] = fn;
> 	}
> 	int val(int i) {
> 		value = i;
> 		emit(EV.VAL_CHANGED);
> 		return value;
> 	}
> 	int val() {
> 		return value;
> 	}
> 	void delegate()[EV] subscribers;
> 	int value;
> }
> 
> class Bar
> {
> 	this(Foo f) {
> 		foo = f;
> 		foo.sub(Foo.EV.VAL_CHANGED, &receive);
> 	}
> 	void receive() {
> 		writefln("received %d", foo.val);
> 
> 	}
> 	Foo foo;
> }
> 
> void main()
> {
> 	auto f = new Foo();
> 	auto b = new Bar(f);
> 	f.val = 1;
> 	delete b;
> 	f.val = 2;
> }

-- 
serg.



More information about the Digitalmars-d mailing list