我最近在一家公司完成了为期6个月的实习,该公司的大部分编程都使用C#。在这段时间里,我第一次使用并习惯了C#处理事件的方式。如下所示:
acc.AccountBalanceLow += new AccountBalanceDelegate(atm.AccountToLow);
acc.AccountBalanceLow +=new AccountBalanceDelegate(atm.AccountToLowAgain);
D支持这样的构造吗?我想用户可以通过使用操作符重载来创建一个,但我不能完全确定。如果不可能,那么什么是常见的例外方式呢?
发布于 2011-01-27 00:00:17
D中的等效构造是使用Signals and Slots。这是实现Observer Pattern的另一种方式,这实际上就是C#事件所做的事情。
发布于 2011-01-27 00:00:15
D(和C++)使用一种类似的模式,称为signals and slots。
发布于 2011-01-28 17:03:00
如果您觉得需要使用C#样式的事件而不是信号和插槽,那么它们的实现非常简单:
module fluidity.core.event;
class Event {
alias void delegate(EventArgs) handler_t;
handler_t[] handlers;
Object owner;
this() {}
this(Object o) { owner = o; }
void attach(handler_t handler) {
if (handler)
handlers ~= handler;
}
void detach(handler_t handler) {
int i = -1;
foreach (j, h; handlers)
{
if (h is handler)
{
i = j;
break;
}
}
if (i > -1)
handlers = handlers[0..i] ~ handlers[i+1..$];
}
void raise() { raise(new EventArgs(owner)); }
void raise(EventArgs e) {
// call all handlers
foreach (handler; handlers)
{
if (handler)
handler(e);
}
}
void opAddAssign(handler_t handler) {
attach(handler);
}
void opSubAssign(handler_t handler) {
detach(handler);
}
}
class EventArgs {
Object source;
bool handled;
void handle() { handled = true; }
this() {}
this(Object s) {
source = s;
}
}
https://stackoverflow.com/questions/4811556
复制