代表者を必要とする現実世界の場所は何ですか?この方法が最善の解決策である場合、どのような状況やパターンが存在するのか興味があります。コードは必要ありません。
8 に答える
デリゲートは、特定の種類のメソッドを定義する名前付きの型です。クラス定義が、それが定義する特定の種類のオブジェクトのすべてのメンバーを配置するのと同様に、デリゲートは、定義する種類のメソッドのメソッド シグネチャを配置します。
このステートメントに基づいて、デリゲートは関数ポインターであり、その関数がどのように見えるかを定義します。
デリゲートの実際のアプリケーションの良い例はPredicateです。リンクの例では、Array.Findが配列を使用して検索し、述語を使用して検索対象の条件を処理していることに気付くでしょう。この場合、Predicate 署名に一致するメソッド ProductGT10 を渡します。
ジェネリック リストのデリゲートの一般的な使用方法の 1 つは、アクション デリゲート (またはその匿名の同等物) を使用して、1 行の foreach 操作を作成することです。
myList.Foreach( i => i.DoSomething());
また、Predicate デリゲートは、リストの検索またはプルーニングにも非常に役立ちます。
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
コードは必要ないとおっしゃっていましたが、その有用性をコードで表現する方が簡単だと思います。:)
イベントをイベントハンドラーにバインドすることは、通常、デリゲートの最初の紹介です...デリゲートはEventHandlerクラスにラップされているため、イベントを使用していることすら知らない場合があります。
私はあなたと同じ質問をして、答えを求めてこのサイトに行きました。
どうやら、このスレッドの例をざっと読んでもよく理解できませんでした。
私が読んだ今、デリゲートの優れた用途を見つけました: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
Forms は、POST/GET (QueryString) を使用して ASP.NET Web サイトよりも値を渡すのがはるかに複雑であるため、これは新しいユーザーにとってより明白に思えるかもしれません。
基本的に、 「TextBoxテキスト」をパラメーターとして受け取るデリゲートを定義します。
// フォーム1
// Class Property Definition
public delegate void delPassData(TextBox text);
// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
Form2 frm= new Form2();
delPassData del=new delPassData(frm.funData);
del(this.textBox1);
frm.Show();
}
// 概要: デリゲートを定義し、新しい Form2 クラスをインスタンス化し、funData() 関数をデリゲートに割り当て、textBox をデリゲートに渡します。フォームを表示します。
// フォーム 2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// 概要: TextBox txtForm1 をパラメーターとして (デリゲートで定義されているように) 取り、ラベル テキストを textBox のテキストに割り当てるだけです。
これがデリゲートの使用法を啓発することを願っています:) ..
Delegate パターンが実際のコードでどのように使用されているかを知りたい場合は、Mac OS X の Cocoa を参照してください。Cocoa は、Mac OS X でのプログラミングに Apple が推奨する UI ツールキットであり、Objective C でコーディングされています。各 UI コンポーネントが、サブクラス化やその他の手段ではなく委任によって拡張されるように設計されています。
詳細については、デリゲートに関する Apple の見解をこちらで確認することをお勧めします。
win32 Python を使用するプロジェクトがありました。
さまざまな理由により、一部のモジュールは odbc.py を使用して DB にアクセスし、他のモジュールは pyodbc.py を使用しました。
関数を両方の種類のモジュールで使用する必要がある場合に問題がありました。引数として接続オブジェクトが渡されましたが、時間を表すために dbi.dbiDate または datetime のどちらを使用するかを知る必要がありました。
これは、odbc.py が SQL ステートメントの値として dbi.dbiDate として日付を期待していたのに対し、pyodbc.py は datetime 値を期待していたためです。
さらに厄介なことに、odbc.py と pyodbc.py によって作成された接続オブジェクトでは、追加のフィールドを設定できませんでした。
私の解決策は、odbc.odbc(...) および pyodbc.pyodbc(...) によって返された接続オブジェクトをデリゲート クラスでラップすることでした。元の接続オブジェクトに対する他のすべてのフィールド要求。
クイックグーグル検索はこのhttp://en.wikipedia.org/wiki/Delegation_patternを思いついた。基本的に、呼び出しを別のオブジェクトに転送するオブジェクトを使用するときはいつでも、委任します。