リスト1●クラスを定義するコード
リスト1●クラスを定義するコード
[画像のクリックで拡大表示]
リスト2●リスト1のクラスからインスタンスを作成し,メソッドを呼び出すコード
リスト2●リスト1のクラスからインスタンスを作成し,メソッドを呼び出すコード
[画像のクリックで拡大表示]
図4●リスト1,リスト2の実行結果
図4●リスト1,リスト2の実行結果
[画像のクリックで拡大表示]
図5●privateキーワードで定義したnameプロパティに直接アクセスしようとしたときのエラー・メッセージ
図5●privateキーワードで定義したnameプロパティに直接アクセスしようとしたときのエラー・メッセージ
[画像のクリックで拡大表示]

作成したクラスを利用する

 クラスを定義したら,クラスからインスタンスを作成して利用してみましょう。ActionScriptでは,クラスからインスタンスを作成するには,new演算子を使用します。JavaなどのOOP言語と同じですね。必要であれば,インスタンス生成の際にコンストラクタ関数に渡す引数を指定できます。

new クラス名(コンストラクタ関数に渡す引数)

 実際にAnimalクラスから二つのインスタンスを作成し,それぞれのインスタンスのメソッドを実行してみましょう。まず,作成したクラスを利用するコードを記述するために,画面をclassTest.flaへと切り替えます*4。[コンポーネント]パネルからステージ上へボタンを一つ配置し,ボタンの[アクション]パネルにリスト2[拡大表示]のコードを記述してください。ボタンが押されたときに{ }内を実行するというコードです(ボタンのイベント・ハンドラと呼びます)。

 { }内について見ていきましょう。Animalクラスから「a」と「b」という二つのインスタンスを作成しています。それぞれのインスタンスを作成する際に,コンストラクタ関数に渡す文字列を指定している点にも注目してください。そして,生成した二つのインスタンスそれぞれに対して,getNameメソッドを実行しています。

 コードを記述したら,メニューから[制御]-[ムービープレビュー]とたどって実行してみましょう。ボタンを押すと図4[拡大表示]のウィンドウが現れます。個々のインスタンスの生成時に,コンストラクタ関数が実行され,メソッド実行時にはインスタンス個々のプロパティに応じた文字列が表示されていることがわかります。

 いかがでしょうか。ActionScriptにおけるクラスの定義や利用方法が,ほかのOOP言語とほとんど変わらないことをご確認いただけたと思います。

オブジェクト指向の3本柱をActionScriptで実装してみよう

 OOPの基本といえば,「カプセル化」「継承」「多態性(ポリモーフィズム)」です。ActionScriptで,この三つの実装を行うにはどのようにコードを記述するのかを確認してみましょう。

カプセル化

 まずは,カプセル化です。カプセル化は,オブジェクトごとに担当する役割を決め,関係するデータと機能(プロパティとメソッド)をそれぞれのオブジェクトにまとめるという概念です。各オブジェクトの役割がはっきりするため,バグが発生した場合に,どのオブジェクトを修正すれば良いのかが明確になります。

 また,個々のオブジェクトの独立性を高めるためには,オブジェクトの内部状態に外部から直接アクセスさせずに,公開された手段(インタフェース)を介してだけアクセスできるようにする仕組みが必要になってきます。この仕組みを「情報の隠ぺい」と呼びます。

 カプセル化がきちんとされていれば,オブジェクトを使う側は,公開されたインタフェースさえ知っていれば済みます。プロパティやメソッドの内部での実装を知る必要はありません。一方,オブジェクトを作成する側は,プロパティやメソッドの実装を変更しても,公開しているインタフェースさえ変更しなければ,そのクラスを利用しているプログラムに影響を与えずに済みます。

 カプセル化の仕組みを実現するには,オブジェクトのプロパティやメソッドへのアクセスを制御する手段が必要です。ActionScriptで任意のプロパティやメソッド(両者をまとめてメンバーと呼びます)を外部から直接アクセスできない「プライベートメンバー」にするには,privateキーワードを付けて定義します。一方,外部から直接アクセスできる「パブリックメンバー」にするには,publicキーワードを定義の先頭に付けるか,キーワードを付けずにメンバーを定義します。すなわちActionScriptでは,privateキーワードと,publicキーワードを使い分けて情報の隠ぺいを実装します。

 例えば,Animalクラスのnameプロパティを外部からアクセスできない状態にするには,リスト1[拡大表示]のプロパティ定義の先頭に,privateキーワードを加えます。

class Animal {
 // プロパティの定義
 private var name:String;
 // 以下リスト1と同じ定義内容
}

このように変更してファイルを保存した後,Flashドキュメントのボタンのイベント・ハンドラに,nameプロパティに直接アクセスする以下のようなコードを記述して,ムービープレビューを実行してください。

var a:Animal = new Animal("ポチ");
trace(a.name);

すると,コンパイル・エラーのメッセージが表示されます(図5[拡大表示]) 。privateで宣言されたプロパティに直接アクセスできないことがわかります*5

 しかしprivateで宣言したプロパティであっても,以下のようにgetNameメソッドを通じて間接的にアクセスすることは可能です。

var a:Animal = new Animal("ポチ");
trace(a.getName());

先ほどのコードを修正して実行した結果を確認してください。


Flashドキュメントとクラス・ファイルの保存位置に注意

 ActionScriptでは,自作したクラスをFlashドキュメントで利用する場合には,クラスの定義が記述されているファイル(クラス・ファイル)を探し出せるように,位置情報を教えてあげる必要があります。この位置情報のことをクラスパスと呼びます。

 デフォルトの設定ではクラスパスは,クラスを利用するFlashドキュメントと同じフォルダと,ユーザーごとの「Classes」フォルダに設定されています*A。Classesフォルダには,あらかじめFlashに用意されている様々なクラスが保存されています。今回は,新たに定義するクラスがこれらのクラスに紛れないように,Flashドキュメントと同じフォルダ内にクラス・ファイルを保存しています。

 クラスパスは,個々のFlashドキュメント固有の設定,またはアプリケーション全体の設定として追加することも可能です。クラスを使った開発に慣れてきたら,自作の汎用的なクラスを集めたフォルダを用意して,そこをクラスパスとして指定し,クラスを再利用できるようにしてみましょう。


つづく…

吉岡 梅(よしおか うめ)
山梨県在住のソフトウエア開発者。

◆下記のURLから,サンプル・プログラムを無償ダウンロードできます
http://software.nikkeibp.co.jp/software/download/down04c.html#200408