【问题标题】:C# like events in D programming languageD 编程语言中的 C# 类事件
【发布时间】:2011-01-26 23:56:44
【问题描述】:

我最近在一家使用 C# 进行大部分编程的公司完成了为期 6 个月的实习。在此期间,我第一次使用并习惯了 C# 处理事件的方式。如下图:

acc.AccountBalanceLow += new AccountBalanceDelegate(atm.AccountToLow);
acc.AccountBalanceLow +=new AccountBalanceDelegate(atm.AccountToLowAgain);

D 支持这样的结构吗?我想用户可以通过使用运算符重载来创建一个,但我并不完全确定。如果不可能,那么常见的例外方式是什么?

【问题讨论】:

    标签: events d


    【解决方案1】:

    D 中的等效结构是使用Signals and Slots。这是实现Observer Pattern 的不同方法,这实际上是C# 事件的作用。

    【讨论】:

      【解决方案2】:

      D(和 C++)使用称为 signals and slots 的类似模式。

      【讨论】:

        【解决方案3】:

        如果您觉得需要使用 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;
            }
        }
        

        【讨论】:

          【解决方案4】:

          这是一个使用信号、槽和模板的 c# 样式事件示例:

          events.d:

          import std.signals;
          
          class Event(T...){
              mixin Signal!(T);       
          
              void broadcast(T args){ 
                  emit(args);
              }       
              void opAddAssign(slot_t slot){
                  connect(slot);
              }
              void opSubAssign(slot_t slot) {
                  disconnect(slot);
              }
          }
          

          声明:

              public Event!(int) onSomeEventOfInt;
              public Event!(string, int) onSomeEventOfStringAndInt;
          

          实例化:

              this.onSomeEventOfInt = new Event!(int)();
              this.onSomeEventOfStringAndInt = new Event!(string, int)();
          

          火灾事件:

              int i = 4;
              string str = "hello";
              this.onSomeEventOfInt.broadcast(i);
              this.onSomeEventOfStringAndInt.broadcast(str, 4);
          

          观察者注册:

              obj1.onSomeEventOfInt += &handleEventOfInt
              obj1.onSomeEventOfStringAndInt += &handleEventOfStringAndInt
          
              void handleEventOfInt(int g)
              { /*do something */ }
              void handleEventOfStringAndInt(string str, int g)
              { /*do something */ }
          

          【讨论】:

            【解决方案5】:

            查看 DFL 的事件系统。它的工作方式与 C# .NET 完全相同。

            DFL Event Example

            下载 DFL,获取事件模块并以您喜欢的方式使用它。我修改它以使用可变参数模板参数。这提供了最大的灵活性。

            http://www.dprogramming.com/dfl098.zip

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-21
              • 2010-11-15
              • 1970-01-01
              • 2023-03-13
              • 2014-11-07
              • 1970-01-01
              相关资源
              最近更新 更多