9章デリゲート、ラムダ、イベント

  APIを使う最も一般的な方法は、クラスが提供するメソッドとプロパティを呼び出すことです。しかし、逆向きの呼び出しが必要となることもあります。APIがコードを呼び出す必要がある場合もあるのです。「5章 コレクション」では配列とリストの検索機能について説明しました。この機能の利用例として、引数が基準を満たす場合にはtrueを返すメソッドを定義しました。検索APIは、調べる要素ごとにこのメソッドを呼び出します。しかし、すべてのコールバックが即座に呼び出されるわけではありません。非同期APIでは、長期間続くタスクが完了した時点で指定したメソッドを呼び出すようにできます。クライアントアプリケーションでは、GUI部品に対してボタンのクリックといった操作を行った際に定義したコードを実行させたいこともあります。

 コールバックは、インターフェイスと仮想メソッドを用いて実現できます。「4章 ジェネリック型」では、CompareToメソッドだけを定義するIComparer<T>インターフェイスについて説明しました。このメソッドは、Array.Sortのようなメソッドでソート順序を変更したい場合などに呼び出します。ClickメソッドやDoubleClickメソッドを持つIClickHandlerインターフェイスを定義するUIフレームワークを考えてみましょう。ボタンがクリックされたことを通知してほしい場合には、このフレームワークではこのインターフェイスを実装する必要があります。

 実際、.NETのUIフレームワークでインターフェイスによる方法を用いているものはありません。複数のコールバックが必要になった場合、面倒だからです。シングルクリックやダブルクリックはユーザインタラクションのうちの氷山の一角でしかありません。WPFアプリケーションでは、各UI要素は100種類以上の通知を提供します。たいていは特定の要素ごとに1つや2つのイベントのみを扱えば十分です。100個のメソッドを実装する必要があるインターフェイスは困りものです。 ...

Get プログラミングC# 第8版 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.