我有一个关于提升基类事件的问题。我目前正在阅读MSDN C#编程指南,我无法从下面的文章中理解一件事:
http://msdn.microsoft.com/en-us/library/vstudio/hy3sefw3.aspx
public void AddShape(Shape s)
{
_list.Add(s);
s.ShapeChanged += HandleShapeChanged;
}
好的,我们正在为一个事件注册委托,我们将在事件发生时调用私有方法 HandleShapeChanged 。
public void Update(double d)
{
radius = d;
area = Math.PI * radius * radius;
OnShapeChanged(new ShapeEventArgs(area));
}
protected override void OnShapeChanged(ShapeEventArgs e)
{
base.OnShapeChanged(e);
}
这里我们调用基类方法 OnShapeChanged ,这将成功触发事件。但该事件基于 Shape 类,那么它如何访问隐私的方法 HandleShapeChanged ?
我刚开始学习这门语言,所以请耐心等待。我对这个例子的理解可能远远不够。
答案 0 :(得分:11)
我看到你的思维方式,感觉就像另一个类正在调用私有方法。但不是,考虑它的最佳方式是在委托创建时检查访问规则,而不是在调用它时。那当然没问题,班级可以访问自己的私有方法。
在调用它时检查它会很糟糕,这需要公开事件处理程序。处理事件几乎总是一个类的非常私有的实现细节,不允许外部代码直接调用。因为这意味着您无法在事件处理程序中确定它实际上是触发调用的事件。那很糟糕,很糟糕。
答案 1 :(得分:10)
该事件正在调用该委托。委托中的代码无关紧要。由于未明确调用该方法,因此不适用访问规则。
另请注意,这与事件在基类中的事实无关。即使事件是完全不相关的类,也会发生完全相同的事情。