我有一个带有多个事件的界面
我有 base 类实现接口
我有第三个类扩展基类(让我们称之为theConcreteClass)
问题:当我做类似的事情时: IMyInterface i = new theConcreteClass()然后我订阅任何事件( i.someEvent + = some_handler ;)事件处理程序从未被调用,因为(可能)事件订阅被分配给基类而不是具体类,即使new()运算符创建了具体类。
希望很清楚:)
有什么建议?
感谢,
阿迪巴尔达
答案 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等,并通过覆盖方法轻松挂钩事件在子类中触发的时间。