【コラム】
前回は非形式プロトコルの説明をして、デリゲートでよく使われるという話をした。今回は、形式プロトコルと非形式プロトコルの違いを追求してみよう。
非形式プロトコルに対する、形式プロトコルの利点は、次の2つにある。
デリゲートに、この利点が有効かどうか、説明しよう。
Objective-Cを利用しているフレームワークであるCocoaでは、とても多くのクラスがデリゲート機能を提供している。特に、モデル・ビュー・コントローラ構造の、ビューにあたるクラスでは、基本的な動作の制御は、すべてデリゲートを通して行われる。フレームワークの設計の指針として、クラスの拡張は、できる限りデリゲートで行い、サブクラス化をなるべく避けている、ということが感じられる。アプリケーション固有のロジックは、ほとんどデリゲート内部で実装できる、ということだ。
そのように、デリゲートの利用を中心にすえているために、その接続も簡単にできるようになっている。GUI設計ツールであるInterface Builderを使って、グラフィカルに行えるのだ。デリゲートはGUIの部品に設定することが多いので、そのデザインツール上で設定するのは非常に自然だ。
対象となる部品を選択し、コントロールキーを押しながらドラッグして、デリゲートとなるオブジェクトの上でドロップする。このいつものやり方で、デリゲートも接続できる。
|
|
テーブルビューからドラッグして、delegateの設定 |
このように、デリゲートとなるインスタンスに接続していく。だが、上の図ではデリゲートとして、少し特殊なインスタンスを選択している。File's Ownerと呼ばれるものだ。
Interface Builderの編集結果であるnibファイルは、File's Ownerと呼ばれるインスタンスを含む。これは、nibファイル上のオブジェクトと、外部のオブジェクトをつなぐ、窓口となるものだ。
nibファイルとは、GUIデザインを含むものだが、特別な定義フォーマットを使っている訳ではなく、ソースコードで記述している訳でもない。GUIで使われているインスタンスを、アーカイブしたものである。実行時にnibファイルを読み込むということは、アンアーカイブを行い、インスタンスを復元することである。そのときに、デリゲートを含む、インスタンス間の接続も元通りになる。
ただ、nibファイル内だけで完結せずに、外部のオブジェクトとも接続したいときもあるだろう。たとえば、デリゲートとして、アプリケーションのメインのコントローラであるオブジェクトを指定したいとき、などだ。そのようなときに、File's Ownerを使う。nibファイルを読み込むときにFile's Ownerとなるオブジェクトを指定すると、File's Ownerへの接続は、その外部のオブジェクトへの接続となる。
つまり、File's Ownerになるオブジェクトは、実行時まで分からない、ということだ。ここで、仮に、デリゲートを形式プロトコルで定義し、Interface Builder上でそのチェックを行える、としよう。だが、それは無意味である。なぜならFile's Ownerにあたるオブジェクトは、コンパイル時にもリンク時にも決定しておらず、動作させた時に初めて分かるからだ。そして、File's Ownerへのデリゲートの接続は、よく行われる。
だが、次善の策として次のようなことは考えられる。「確かに、コンパイル時のチェックはできない。だが、File's Ownerを指定する時に、プロトコルに準拠しているかどうかをconformsToProtocol:でチェックする方法はあるのではないか」
これは、ありだろう。指定したクラスのプロトコルのチェックは、プラグインなどでよく行われる。Cocoaでは、NSBundleというクラスを使って、プラグインを読み込むことができる。その際に、読み込もうとしているプラグインが、自分が必要としているものかどうか、プロトコルを使ってチェックできる。
プラグインのように、これからファイルを読み込むとき、またはインスタンスを作成する時には、形式プロトコルによるチェックは有用だろう。
だが、nibファイルでのFile's Ownerの指定は、すでにインスタンス化されているオブジェクトを指定するので、respondsToSelector:によるチェックの方が適切だろう。なぜなら、conformsToProtocol:はクラスオブジェクトに対して適用され、respondsToSelector:はインスタンスオブジェクトを調べるからだ。
以上をもとに、形式プロトコルと非形式プロトコルの使い分けを考えると、次のようになるだろうか。
このように調べてみると、デリゲートのような仕組みには、非形式プロトコルの方が便利だと言えるだろう。
【コラム】ライトニングJava 第23回 Generic Java(4) - Genericを使ってAPIを作成する その1
【コラム】ライトニングJava 第22回 Generic Java(3) - 逆コンパイルで探るGeneric Javaの裏側
| 花粉の運び屋“マルハナバチ”の国勢調査 [18:11 5/24] |
| 「Arid5a」は自己免疫疾患を引き起こすカギ分子の可能性大 - 阪大 [17:39 5/24] |
| 岡山大、中枢神経の「ランビエ絞輪」形成機構の解明に1歩前進 [17:35 5/24] |
| 細胞間接着を担うタンパク質「クローディン」に関する発見 - 阪大など [17:32 5/24] |
| パナソニック、LEDに匹敵する照明用高効率白色有機EL素子を開発 [17:29 5/24] |
|
ジャン=クロード・ヴァン・ダム最大のヒット作『タイムコップ』がリブート化へ [00:09 5/26] エンタメ |
|
ガラパゴス諸島の美しさをストリートビューで - Google Official Blog [23:44 5/25] パソコン |
|
【レビュー】天板がシースルーだと何が便利か - スリムでかっこいい日本HPの複合機「HP ENVY 120」を試す [23:43 5/25] パソコン |
|
【レビュー】タブグループ機能をさらに使いやすくするFirefoxアドオン「Pano」 [22:39 5/25] パソコン |
|
ソフトバンク、「タダデコ」が6月26日にサービス終了 [22:36 5/25] 携帯 |