每个人都知道私有事件处理程序可以监听来自其他类的事件。(文档中的示例总是只使用私有处理程序。)
事件处理程序只不过是另一个类中的私有方法,而不是调用事件。因此,从其类外部调用处理程序会破坏封装。还是我错过了什么?
示例代码,为了完整起见:
class Caller {
public event EventHandler MyEvent;
public void RaiseMyEvent()
{
MyEvent(this, EventArgs.Empty);
}
}
class Receiver
{
private void MyPrivateHandler(Object sender, EventArgs e)
{
Console.WriteLine("I'm a private method!");
}
public void Subscribe(Caller caller)
{
caller.MyEvent += this.MyPrivateHandler;
}
}
订阅后,我们可以轻松地从外部receiver.Subscribe(caller);
调用类中的私有方法: .receiver
caller.RaiseMyEvent();
这是一个纯粹的学术问题,甚至是学术问题。而且,我个人觉得这个功能非常方便、实用,而且非常喜欢。这真的很酷:我们可以显式地授予其他类调用我们私有方法的权利。(我们也可以取消订阅它,并用代表和事件制作很多令人着迷的东西。)无论如何,它仍然违反了封装的纯洁性......或者不是?
PS:感谢 Matthew Watson 指出以下细微差别:订阅事件时,该事件可以独占调用私有处理程序。而如果我们将其公开(或通过公共包装方法调用),则任何人都可以调用它。在可访问性方面有很大差异。
PPS:是的——我从未在教科书中看到过这个问题。如果你知道,请留下参考。