Cocoaでいこう! Macらしく 第5回
Yoshiki(DreamField)
この記事は、MOSAが発行するデベロッパ向けのデジタルマガジンMOSADeN 第64号(2003年5月6日発行)に掲載された記事です。2〜3ヶ月遅れで、ここに掲載して行きます。

CocoaはObjective-Cというオブジェクト指向言語によって実装されていますから、雛形のソースを見て行くためには、ある程度はオブジェクト指向について知っておく必要があります。C++やJAVAの経験がある方でしたら、特に問題は無いでしょうが、C言語でしか組んだことが無い方は、この先聞き慣れない用語が出て来ると思います。残念ながらこの連載では、オブジェクト指向についての説明まではできません。ボリュームが多すぎますし、そこまで書いていたら焦点がぼやけてしまうと思うからです。そこでオブジェクト指向言語の経験が無い方は、参考文献として次の本を購入し、少なくとも第一章は読んでおくことをお勧めします。

Mac OS Xプログラミング入門
Objective-C
萩原剛志(著)
公文社
ISBN4-87778-068-8

Document-based Applicationの構造

前回、JPEGファイルをOpen Panelから選べるようにしました。今回は、それを開いた後、どんな処理をしているのか見て行きます。

TinyViewのプロジェクトを開いて下さい。そして前回の様にTinyViewを実行し、JPEGファイルを複数開いてみて下さい(fig.01)。

ProjectBuilderのアイコン
[fig.01] TinyViewで複数のJPEGファイルを開いたところ

JPEGファイルを開くたびにウィンドウが開きます。この様なアプリケーションの場合、通常、ファイルを開くたびにドキュメントを管理するクラスをインスタンス化し、それにファイルを渡して、その管理をまかせているはずです(fig.02)。

ProjectBuilderのアイコン
[fig.02] Document-based Applicationの一般的な構造

こうすれば、そのプログラムは単体のファイルだけを気にすれば良いことになります。CodeWarriorのPowerPlantの雛形のソースでは、CTextDocument.cpがそうでした(Project StationaryをDocument PPCにした場合)(fig.03)。Cocoaにもこれに当たるクラスがあるはずですね。

ProjectBuilderのアイコン
[fig.03] PowerPlantの雛形の構造

では、雛形のソースを見てみましょう。一度TinyViewは終了して下さい。そして、TinyViewのプロジェクトウィンドウを選んで、「ファイル」タブを選び、表示された一覧の中から「Classes」というグループを開いてみて下さい。中身はMyDocument.hとMyDocument.mという名前の二つのファイルです(fig.04)。

ProjectBuilderのアイコン
[fig.04] Classesを開くとファイルが二つ見える

Ovjective-Cにおいて、最後に「.h」が付いているのはヘッダー、「.m」はソースです。この二つしか無いのですから、雛形のソースとしてクラスが一つしか用意されていないことになります。このことから容易に想像が付くと思いますが、このMyDocument.mが、PowerPlantで言う所のCTextDocument.cpに当たるものです。つまり、ドキュメントと一対一対応でインスタンス化され、そのドキュメントの管理をまかされるクラスです(fig.05)。

ProjectBuilderのアイコン
[fig.05] Cocoaの雛形の構造

でも、このクラスをインスタンス化しているソースが見当たりません。PowerPlantでしたら、CDocumentApp.cpというソースが雛形として用意されていて、その中でCTextDocumentクラスをインスタンス化していました(fig.03)。ですからその部分のソースを変更することにより、CTextDocumentとは違う名前にも出来ましたし、条件によっていくつかの種類のクラスの中から一つを選んでインスタンス化するということも出来ました。でも、Cocoaにそれが無い。ということは、生成するクラスがMyDocumentと言うのは、決め打ちなのでしょうか?実はこれは前回設定した「書類のタイプ」で指定していたのです。

前回設定した「書類のタイプ」を見て下さい。一番下に「書類のクラス」という項目があり、ここに「MyDocument」と書いてあります(fig.06)。これがその指定です。

ProjectBuilderのアイコン
[fig.06] 書類のタイプの「書類のクラス」

前回の説明では触れませんでしたが、「書類のタイプ」では、開けるファイルの拡張子やOSタイプの設定を行うだけでなく、開いた時にどのクラスをインスタンス化するのかまでも指定できるのです。こんなことができるのも、Objective-Cが動的結合だからです。これにより、CDocumentApp.cpの様な雛形を用意する必要が無くなり、ソースの改造も必要無いというわけです。では、複数の種類のドキュメントを開けるようにし、開いたドキュメントの種類によって、生成するクラスを変更したい時はどうするのか?その場合は、「書類のタイプ」を複数行設定し、それぞれの「書類のクラス」に違うクラス名を指定すれば良いわけです(fig.07)。

ProjectBuilderのアイコン
[fig.07] 書類のタイプを複数行設定した時の例

※fig.07は一例を上げただけですので、この指定は行わないで下さい。本連載では、まずはJPEGを開けるようにすることから始めますので。

では、本日はここまでとしまして、次回はMyDocumentがインスタンス化された後に、どんな風にデータが渡って来るのか、具体的に見て行くことにします。

前頁目次次頁