3

If I follow any of a number of examples available on the web, I see a common theme emerge with the delegate pattern:

myClass.delegate = self;

From what I read, delegation is supposed to uncouple behavior, but allow interaction between classes, however, only assigning a single delegate seems to be 100% at odds with this behavior.

I have a web dev background, and I am intimately familiar with pub/sub patterns, but what I'm trying to wrap my head around is why I would only allow a single delegate (self) to be able to act on whatever happens in myClass. That would seem to ruin the entire point of delegation.

Maybe I'm misunderstanding something, or maybe this is only the simplest form of delegation, but could someone please explain how statically assigning (in the classic sense) one class to another's delegate decouples behavior in any meaningful way.

Bonus: Perhaps a way to allow multiple classes to act on a delegation.

4

2 に答える 2

4

デリゲートは、デリゲートされたクラスに対する追加の制御をアサートします。最も単純な例はwindowShouldClose:、NSWindowDelegateプロトコルのメソッドです。クラスデリゲートは、NSWindowでウィンドウを閉じることをプロアクティブにオーバーライドする機会を得ます。複数の代理人が許可された場合、複数の代理人が競合する注文を提供する可能性があり、これは望ましくない結果になります。

ここに画像の説明を入力してください

委任を使用すると、サブクラス化せずに動作をカスタマイズできます。クラスは多くのデリゲートプロトコルを実装できるため、Objective-CのMVCプログラミングモデルの重要な部分です。委任により、1つのクラスを他の複数のクラスの「コントローラー」として作成できます。

クラスに何が起こったかに反応して行動するために、KeyValueObservingのpub/subモデルを使用します。たとえば、キュ​​ー内の操作数の変化に対応できるようにNSOperationQueueする監視可能なプロパティがあります。operationCount

于 2013-03-23T18:41:20.073 に答える
1

委任者は、(おそらく) 特定の一連のメソッドに応答すること以外、委任者について何も知る必要がないという意味で、動作を分離します。これにより、デリゲートを持つクラスを変更することなく、まったく異なるコードベース/状況で使用できるようになります。これは、他の誰かが使用するフレームワーク クラスを作成する場合に特に適用されます。これが、システム フレームワークで頻繁に使用される理由の 1 つです。

委譲の主な用途の 1 つは、サブクラス化せずにオブジェクトの動作をカスタマイズできるようにすることです。NSWindowDelegateメソッドを例にとると-windowWillResize:toSize:、デリゲートは提案されたものとは異なるサイズを返すことができ、カスタムのサイズ変更動作を実装できます。このシナリオは、それぞれが異なる値を返す複数のデリゲートでどのように処理されますか?

もちろん、デリゲート メソッドは、特定のイベントが発生したことをデリゲートに通知することだけを目的としている場合もあります。このような場合、複数のオブジェクトが通知を受けることは確かに合理的です。これは、通知 ( NSNotification ) とKey Value Observing (KVO) によって Objective-C/Cocoa で提供されます。Cocoa では、デリゲート以外のオブジェクトがそれについて知りたい場合に備えて、デリゲート メソッドにも対応する通知が投稿されるケースがたくさんあります ( windowWillClose: /NSWindowWillCloseNotification など)。

于 2013-03-23T18:46:05.957 に答える