代码之家  ›  专栏  ›  技术社区  ›  Tim Lovell-Smith

如何在C中实现抽象事件或接口方法事件?

  •  1
  • Tim Lovell-Smith  · 技术社区  · 14 年前

    我的基本接口ifoo声明

    event EventHandler Changed
    

    当我执行“实现接口”时,我会得到一些蹩脚的样板代码,但是如何提供一个合适的默认实现呢?

    add { throw new NotImplementedException(); }
    remove { throw new NotImplementedException(); }
    
    3 回复  |  直到 14 年前
        1
  •  4
  •   JaredReisinger    14 年前

    接口如何声明以事件名称为前缀的事件?我不确定这是否合法。

    如果不使用“ifoo.”前缀就可以离开,只需在类中声明事件,让编译器为您创建默认的添加/删除句柄。你只需要担心什么时候 触发 事件:

    interface IFoo
    {
        event EventHandler OnChanged;
    }
    
    class MyClass : IFoo
    {
        public event EventHandler OnChanged;
    
        private FireOnChanged()
        {
            EventHandler handler = this.OnChanged;
            if (handler != null)
            {
                handler(this, EventArgs.Empty); // with appropriate args, of course...
            }
        }
    }
    

    …还是我误解了你从哪里继承了这件事?您的类是否派生自一个抽象基类,该类反过来实现一个接口(该接口声明了事件)?这可能是你的意思,但问题并不清楚。

        2
  •  2
  •   Tim Lovell-Smith    14 年前
    private EventHandler onChanged;
    
    event EventHandler IFoo.OnChanged
    {
        add
        {
            onChanged += value;
        }
        remove
        {
            onChanged -= value;
        }
    }
    
        3
  •  0
  •   Community noseratio    7 年前

    我建议您更改事件的名称,以符合事件的通用命名标准。在这种情况下改变了。 Link to previous post

       private System.EventHandler _Changed;
    
        private readonly object _EventLock = new object();
    
        public event System.EventHandler Changed {
            add {
                lock (_EventLock) {
                    _Changed += value;
                }
            }
            remove {
                lock (_EventLock) {
                    _Changed -= value;
                }
            }
        }
    
        protected virtual void OnChanged(System.EventArgs args) {
    
            System.EventHandler handler = _Changed;
            if (handler != null) {
                handler(this, args);
            }
        }