ゆーたんのつぶやき

株式会社ノークリサーチにてIT関連のシニアアナリストとして活動しています。

デリゲートとインターフェース



デリゲートとインターフェースはどちらも「仕様と実装の分離」という観点では
良く似ています。C#においては言語仕様としてデリゲートもインターフェースも
明確に規定されていますが、それらの使い分けに迷うことがあるかも知れません。
ボクは両者を粒度の違いという観点から以下のように区別しています。


・デリゲートは単独の関数を単位とする
・インターフェースはあるオブジェクトを対象とした一連の操作の集合を単位とする


Javaの場合は言語仕様としてデリゲートが規定されているわけではないので、
デリゲートと同じことをやろうとした場合には実質的にはインターフェース
を用いるのが一般的ではないかと思います。そう考えると仕様と実装の分離
という観点に限っていえば、C#の方がよりきめ細かい粒度の選択ができると
いえます。


C#のデリゲートで便利なのは「+=」や「-=」といった演算子を使うことで
デリゲートの登録・削除が容易に行える点です。例えば、クラスconsumer
のデリゲートdoProcessに対して、クラスprovider1のデリゲート実装method1
とクラスprovider2のデリゲート実装method2を追加したい場合には下記のよう
に書けます。


consumer.doProcess += new doProcess(provider1.method1);
consumer.doProcess += new doProcess(provider2.method2);


UIコンポーネントに対するイベントハンドラの登録・削除ロジックなどを
組む際にはとても重宝しそうですね。