【问题标题】:Why can a base class event call a private method?为什么基类事件可以调用私有方法?
【发布时间】:2013-11-30 21:19:44
【问题描述】:

我有一个关于引发基类事件的问题。我目前正在阅读 MSDN C# Programming Guide,但我无法从以下文章中理解一件事:

http://msdn.microsoft.com/en-us/library/vstudio/hy3sefw3.aspx

public void AddShape(Shape s)
{
    _list.Add(s);
    s.ShapeChanged += HandleShapeChanged;
}

好的,所以我们正在向一个事件注册代理,并且在引发事件时我们将调用 private 方法 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方法呢?

我刚刚开始学习语言,所以请多多包涵。我对这个例子的理解可能偏离了目标。

【问题讨论】:

  • Encapsulation issue with delegates? 的可能副本。引用 Eric Lippert 接受的答案:“方法的可访问域不限制可以调用该方法的位置。它限制可以按名称查找方法的位置。”

标签: c# events base


【解决方案1】:

我明白你的想法,感觉就像另一个类正在调用私有方法。但是不,最好的考虑方法是在创建委托时检查访问规则,而不是在调用委托时检查。这当然没问题,类可以访问自己的私有方法。

当它被调用时检查它会很糟糕,这需要将事件处理程序公开。处理事件几乎总是一个非常私密的类的实现细节,任何外部代码都不应该被允许直接调用。因为这意味着您无法在事件处理程序中确定它实际上是触发调用的事件。这很糟糕,非常糟糕。

【讨论】:

    【解决方案2】:

    事件正在调用委托。委托中的代码无关紧要。由于没有显式调用该方法,因此不适用访问规则。

    还要注意,这与事件在基类中这一事实无关。即使事件在完全不相关的类中也会发生完全相同的事情。

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2013-03-25
      相关资源
      最近更新 更多