プライベート イベント ハンドラが他のクラスのイベントをリッスンできることは誰もが知っています。(ドキュメントの例では、常にプライベート ハンドラーのみを使用します。)
イベント ハンドラーは、呼び出し元のイベントとは別のクラスのプライベート メソッドにすぎません。そのため、クラス外からハンドラーを呼び出すと、カプセル化が解除されます。または、何か不足していますか?
完全を期すためのコード例:
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 に感謝します。イベントにサブスクライブすると、プライベート ハンドラーをこのイベントから排他的に呼び出すことができます。これをパブリックにすると (または public ラッパー メソッドを介して呼び出すと)、誰でも呼び出すことができます。アクセシビリティに大きな違いがあります。
PPS: はい、この問題が教科書で言及されているのを見たことがありません。ご存知の方、参考になさってください。