4

プライベート イベント ハンドラが他のクラスのイベントをリッスンできることは誰もが知っています。(ドキュメントの例では、常にプライベート ハンドラーのみを使用します。)

イベント ハンドラーは、呼び出し元のイベントとは別のクラスのプライベート メソッドにすぎません。そのため、クラス外からハンドラーを呼び出すと、カプセル化が解除されます。または、何か不足していますか?

完全を期すためのコード例:

 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); プライベート メソッドを問題なく呼び出すことができます。receivercaller.RaiseMyEvent();

それは純粋に学問的な問題であり、学問的でさえあります。さらに、私は個人的にこの機能が非常に便利で実用的であり、実際に気に入っています。これは本当にクールです: プライベート メソッドを呼び出す権利を他のクラスに明示的に与えることができます。(登録を解除して、デリゲートとイベントを使って多くの魅力的なものを作成することもできます。) とにかく、カプセル化の純粋性にまだ違反しています...それとも?

PS: 次のニュアンスを指摘してくれた Matthew Watson に感謝します。イベントにサブスクライブすると、プライベート ハンドラーをこのイベントから排他的に呼び出すことができます。これをパブリックにすると (または public ラッパー メソッドを介して呼び出すと)、誰でも呼び出すことができます。アクセシビリティに大きな違いがあります。

PPS: はい、この問題が教科書で言及されているのを見たことがありません。ご存知の方、参考になさってください。

4

3 に答える 3

0

プライベート イベント ハンドラは、イベントとして使用するオプションをユーザーに提供することにのみ関心があるため、プライベートです。

private void MyPrivateHandler(Object sender, EventArgs e)
{
    Console.WriteLine("I'm a private method!");
}

public void Subscribe(Caller caller)
{
    caller.MyEvent += this.MyPrivateHandler;
}

と同じです

public void Subscribe(Caller caller)
{
    caller.MyEvent += (sender,e)=>{Console.WriteLine("I'm a anonymous method!"); }
}
于 2013-04-23T08:16:02.863 に答える
0

明らかに、どちらのクラスの外から caller.RaiseMyEvent() を実行する場合でも、誰がイベントを処理するのかを知る必要はありません。

実際、Receiver の Subscribe メソッドは public であるべきではないと思います。この種の目的は無効です。レシーバーがイベントの処理に関心がある場合は、それ自体をサブスクライブする必要があり、他のユーザーにサブスクライブさせてはなりません。このようにして、サブスクリプションのステータスとそれを処理するメソッドを隠しておきます。

レシーバー クラスでこのプライベート メソッドを直接呼び出すことはなく、それについて何も想定しないでください。受信者クラスは、いつでも自分自身をサブスクライブ解除できます。

カプセル化をいじっていますが、完全に違反しているとは思いません。基本的に放送系です。

あるテレビ局が人々に外出してリンゴを盗むように忠告し、彼らが実際にそれを行った場合、誰が責任を負いますか? テレビ局か、それとも盗みを働く人々か?私は後者だと思います。イベントについても同じことが言えます。イベントを発生させる人は、その影響について心配する必要はありません。

于 2013-04-23T08:04:57.913 に答える