リスト3●extendsキーワードで継承を行っているコード
リスト3●extendsキーワードで継承を行っているコード
[画像のクリックで拡大表示]
図6●リスト3のクラスを利用するコードの実行結果
図6●リスト3のクラスを利用するコードの実行結果
[画像のクリックで拡大表示]
リスト4●同名のメソッドを定義して多態性を実現するコード
リスト4●同名のメソッドを定義して多態性を実現するコード
[画像のクリックで拡大表示]
図7●リスト3と4のクラスを利用するコードの実行結果
図7●リスト3と4のクラスを利用するコードの実行結果
[画像のクリックで拡大表示]
リスト5●スーパークラスのメソッドをオーバーライドするコード
リスト5●スーパークラスのメソッドをオーバーライドするコード
[画像のクリックで拡大表示]
図8●リスト3と5のクラスを利用するコードの実行結果
図8●リスト3と5のクラスを利用するコードの実行結果
[画像のクリックで拡大表示]
継承

 次に「継承」の仕組みを見てみましょう。継承とは,任意のクラス(Aとします)の機能を受け継いで,別のクラス(Bとします)を定義する仕組みです。このとき,AをBのスーパークラス,あるいは親クラスと呼び,BをAのサブクラス,あるいは子クラス*6 と呼びます。

 サブクラスに共通するメソッドやプロパティをスーパークラスに集約して,継承により引き継ぐことで,同じコードを重複して記述する無駄が省けます。また,プログラム全体が整理され,わかりやすくなるというメリットもあります。

 ActionScriptで継承を実装するには,Javaと同じようにextendsキーワードを使用します。ActionScriptで継承を行う際には,一つのサブクラスの親クラスに指定できるのは一つだけです*7。複数の親クラスを持つサブクラスは作成できません*8。具体的には

class サブクラス extends スーパークラス {
 // 処理
}

のような形になります。後は,サブクラス側に独自に追加したいプロパティやメソッドのみを,中カッコ{ }の中に追加するだけです。

 例えば,Animalクラスを継承するDogクラスを作成するには,リスト3[拡大表示]のようにコードを記述します。Dogクラスは,Animalクラスが備えるメンバーに加えて,masterNameプロパティとsayYourMasterメソッドを備えることになります。コンストラクタ内で使っているsuperは,スーパークラスのコンストラクタを実行する演算子です。ここでは,サブクラスのコンストラクタの引数myNameをスーパークラスのコンストラクタに渡して実行させています。super演算子をうまく使えば,複数のクラスのコンストラクタ内で同じ処理を何度も記述することを避けて,保守性の高いコードを記述することができます。

 リスト3のDogクラスをAnimalクラスとは別のファイル(Dog.as)として保存してください。Flashドキュメントのボタンのイベント・ハンドラに以下のコードを記述してDogクラスのインスタンスが,Animalクラスを継承していることを確認してみましょう。

var a:Dog = new Dog("ポチ", "タケル");
trace(a.getName());
a.sayYourMaster();
結果は,図6[拡大表示]のようになります。Dogクラスのインスタンスから,Animalクラスで定義したメンバーgetNameと,Dogクラスで定義したメンバーsayYourMasterの両方を使用できることが確認できましたね。
多態性

 最後は「多態性」です。多態性とは,同じ命令を与えた時に,オブジェクトごとに独自の動作を行わせる仕組みです。例えば,犬と猫に同じように「鳴け」と命令すれば,犬はワンと鳴き,猫はニャーと鳴きます。命令する我々はいちいち「ワンと鳴け」「ニャーと鳴け」という2種類の命令を覚える必要は無く,「鳴け」という命令さえ覚えていれば良いことになります。特に,継承を行うような本質的に似ている複数のオブジェクトを扱う場合,多態性を利用することで非常に利用しやすいオブジェクトを作成できます。

 ActionScriptでは,同名のメソッドを持つクラスを作成することで多態性を実装します。例えば,リスト4[拡大表示]のようにDogクラスと同じsayYourMasterメソッドを持つCatクラスを作成してファイル(Cat.as)に保存してください。Flashドキュメントのボタンのイベント・ハンドラに以下のコードを記述し,DogクラスとCatクラスに対してsayYourMasterメソッドを実行した結果を確認してみましょう。

var a:Dog = new Dog("ポチ", "タケル");
var b:Cat = new Cat("ニャオン");
a.sayYourMaster(); //Dogクラスのインスタンスで実行
b.sayYourMaster(); //Catクラスのインスタンスで実行

同じsayYourMasterメソッドを実行しても,異なる結果が出力されますね(図7[拡大表示])。

 また,OOP言語で多態性を実装する仕組みの一つとして「オーバーライド」という仕組みがあります。オーバーライドは,スーパークラス側で定義されているメソッドを,サブクラス側に同名のメソッドを作成することで,いわば「上書き」してしまう仕組みです。特に,一つのスーパークラスから複数のサブクラスを作成し,そのうちの一つだけメソッドの処理内容を変更したい,というような場合に有効です。

 ActionScriptでも,このオーバーライドの仕組みが使用できます。例えば,Catクラスにおいて,スーパークラスであるAnimalクラスのgetNameメソッドをオーバーライドしてみましょう(リスト5[拡大表示])*9。オーバーライドしたCatクラスと,Dogクラスに対してgetNameメソッドを実行してみます。

var a:Dog = new Dog("ポチ", "タケル");
var b:Cat = new Cat("ニャオン");
trace(a.getName());
trace(b.getName());

スーパークラスで定義したgetNameメソッドを,Catクラスでオーバーライドしたため,異なる結果が出力されていることを確認できますね(図8[拡大表示])*10


つづく…

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

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