C# - 事件和接口

时间:2009-07-07 15:47:45

标签: c# events interface

我有一个带有多个事件的界面 我有 base 类实现接口
我有第三个类扩展基类(让我们称之为theConcreteClass)

问题:当我做类似的事情时: IMyInterface i = new theConcreteClass()然后我订阅任何事件( i.someEvent + = some_handler ;)事件处理程序从未被调用,因为(可能)事件订阅被分配给基类而不是具体类,即使new()运算符创建了具体类。

希望很清楚:)
有什么建议?

感谢,
阿迪巴尔达

1 个答案:

答案 0 :(得分:6)

您所描述的按预期工作。

您是否已在隐藏基本实现的具体类中再次声明事件?

您的代码应为:

public interface IInterface
{
    event EventHandler TestEvent;
}

public class Base : IInterface
{
    public event EventHandler TestEvent;
}

public class Concrete : Base
{
   //Nothing needed here
}

回答你的评论:

标准做法是在基类上放置一个方法:

public class Base : IInterface
{
    public event EventHandler TestEvent;

    protected virtual void OnTestEvent()
    {
        if (TestEvent != null)
       {
           TextEvent(this, EventArgs.Empty);
       }
    }
}

public class Concrete : Base
{
   public void SomethingHappened()
   {
       OnTestEvent();
   }
}

这种模式有助于集中任何触发事件的逻辑,测试null等,并通过覆盖方法轻松挂钩事件在子类中触发的时间。