[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 13510] Re: 「 The Art of Multiprocessor Programming 」を読む会第 9 回議事録



高橋(徹)です。

(2011/04/25 21:14), TAKAHASHI, Tomohiro wrote:
> 高橋(智)です。
>
> C#(.NET)で interface と delegate とを設計上使い分けるポイントは?、という疑問ですが、
> 答えになっているか怪しいですが、
> C# in Depth, Second Edition
> http://www.manning.com/skeet2/
> の「2.1 Delegates」では、以下のように述べられています。
> 通知目的であればdelegateを使う、ということでしょうか。。。

そのようですね。ちょうど去年Effective C# 2nd Editionを読んだとき、勉強
ノートを
作っていたので、そこから、デリゲートに関する項目 24 デリゲートによるコー
ルバック
を載せます。

「C#ではコールバックをデリゲートで表現する。型安全、主にイベント通知で使
われる。
2つのクラス間で通信が必要だが結合を疎にしたいとき(インタフェースよりも)、
デリゲートは有力な選択肢。実行時に通知先を指定でき、複数に配信できる。
デリゲート自体がオブジェクトで、メソッドへの参照を持つ。メソッドはstaticでも
インスタンスでも可。C#はラムダ式でデリゲートを簡潔に表現できる。
.NET Frameworkライブラリには標準的なデリゲート Predicate<T>, Action<>,
Func<> が定義されている。」

ということで、C言語での関数ポインタによるコールバックを、型安全な言語仕様で
取り込んだのがデリゲート、interfaceでもコールバックは実現できるが、より
疎結合を
達成できるのがメリット、ということのようです。

C++では、言語仕様ではないですが、コールバックを扱う「シグナル&スロット」
というパターンがあり、QtやBoostで提供されています。
Qtの場合は、独自文法をプリプロセッサでC++に変換する手法を、Boostはテンプ
レート
で頑張る手法で実現しています。