CocoaとC#のデリゲート
以前作成したアプリをv10.6SDKベースでコンパイルしたら警告がでました。何でかなーと思って調べてみるとアプリケーションで使用しているNSRuleEditorのdelegateメソッドがNSRuleEditorDelegateプロトコルに昇格(?)していました。なので、delegateメソッドを実装するクラスは<NSRuleEditorDelegate>しなければいけませんでした。ドキュメント10.6 Symbole Changesを見てみるとNSWindowはじめ多くのdelegateがプロトコル化されていることがわかります。
Objective-C 2.0でプロトコルでもオプション指定ができるようになったので、カテゴリ(非形式プロトコル)定義されていたデリゲートが形式プロトコル化されるのは自然な流れかもしれません。これまではよほど大量のデリゲートメソッドを実装するのでなければ、コントローラクラスの片隅にチョコっとデリゲートメソッド実装していましたが、オブジェクトの独立性や保守性を考えれば、今後はきちんとデリゲート用のクラスを作成するという方向になっていくのでしょう。
デリゲートといえば、前エントリでは嬉々としてデリゲート便利!などと騒いだ手前恥ずかしいのですが、冷静になってみるとInvoke(delegate)はやっぱり単なる「関数ポインタ」と言ったほうがいいのじゃないかと思ったりしてます。設計上の理由によりメソッドの実装を”他オブジェクトに譲(ってもいい|るべきだ)”とすることをデリゲートと呼ぶのであって、たとえばコールバックでの関数ポインタの代替として(文法上)のデリゲートとは意識的に分けて考えたほうが正しいあり方のように思います。
CocoaではObjective-Cでデリゲートが提供されているわけではないので文法上のデリゲートというものはないのでデリゲートと言えば、設計された”委譲”のことを指します。個人的にはよりオブジェクト指向を促進するようなフレームワークのほうが好きです。もちろん、Cocoaの場合は自作クラスでデリゲートを実現するのは難しくなる(もちろんできないわけではありません)ため安易に継承を強要するような設計にならないよう注意する必要もでてくるわけですが、言語やフレームワークの設計においてはトレードオフが存在するし全ての場面で”ベスト”であるものなどあり得ませんから、大事なことは利用するプログラマの意識ということになると思います。ただただ、あるものを文法に適合するよう組み合わせるだけではダメだということです。エラソーですが、そんなことを思った次第。









Comments