代表団について理解を深めたいと思います。誰かが委任の良いコード サンプルを貼り付けて、それがどのように機能するかを説明できますか?
5 に答える
http://en.wikipedia.org/wiki/Delegation_pattern#Objective-C_exampleにかなり良い例があります。
この例でMyCoolAppController
は、 と タイプのオブジェクトを作成しTCScrollView
、 の「デリゲート」プロパティを に設定TCScrollView
しself
ます。これは、TCScrollView が呼び出されたときに
[delegate scrollView:self shouldScrollToPoint:to]
( TCScrollViewMyCoolAppController
のデリゲート) にいくつかの計算を実行し、スクロールしても問題ないかどうかを確認するように求めています。これを説明するために、"MyCoolAppController
は " のデリゲートであると言えます。代わりに何らかの作業を依頼します。TCScrollView
TCScrollView
MyCoolAppController
.NET、Java、または他の言語デリゲートのことですか?
.NET 用語でのデリゲートは、関数ポインターにすぎません。つまり、実行可能コードのブロックを指す変数です。それらは多くの方法で使用できます。1 つの方法は、イベントのコンテキストでそれらを使用することです。ASP.NET ページがあり、MVP (そのページのモデル ビュー プレゼンター パターン) を使用しているとします。ビューの保存ボタンのクリック イベントがプレゼンターに通知されるようにします。ビュー インターフェイスでイベントを定義できますが、そのイベントをサブスクライブしてアクションを実行するには、イベントが発生したときに起動されるメソッドを登録する必要があります。例えば:
public class ClassThatRegistersForEvent
{
public void InitializeView(IView view)
{
view.SaveButtonClickedEvent += delegate{
// do stuff in here when the event is raised
}
}
}
public interface IView
{
event System.EventHandler SaveButtonClickedEvent;
}
委任を説明するために私が書いた答えは次のとおりです。
デリゲートは、イベントに応答する方法です。他の言語では、おそらくサブクラス化によってこれを行うでしょう。たとえば、テーブル ビューがあるとします。tableview をサブクラス化して tableView:didSelectRowAtIndexPath: メソッドをオーバーライドすることもできますが、それは面倒になり、不要なサブクラスが作成されます (再利用できないという事実とともに)。代わりに、TableViewDelegate クラスを作成し、それについてテーブル ビューに伝えます (tableView .デリゲート)。このようにして、何かが起こったときにメソッドが自動的に呼び出されます。これは、イベント処理に対する非常にクリーンなソリューションです。
デリゲートを含むいくつかのアプリ (テーブル ビューは大きなアプリです) を作成すると、コツがつかめます。