編集部注:この連載をより深く理解するためには、記事「いまさら聞けない! FlashとActionScriptについて」も併せてご覧ください。
前回の「ActionScriptで学ぶクラスやオブジェクト指向の基礎」では、クラスの概念や作り方などの説明をしました。今回はクラスの具体的な使い方や、そのほかの便利な概念などを解説し、なぜクラスを使うのか、なぜオブジェクト指向が主流になっているのかをお伝えできればと思います。
編集部注:オブジェクト指向について詳しく知りたい読者は、「連載「ここから始めるオブジェクト指向」」をご覧ください。
クラスには「継承」という概念があります。「継承」という言葉は日常生活でも使うことがありますね。某戦闘アニメではス○パ○サ○ヤ人の血をその息子が「継承」していますし、近所のそば屋では、2代目が初代の味を「継承」し店を守っている、ということもあると思います。
オブジェクト指向でいう「継承」もほぼ同じ意味で使います。ActionScript(以下、AS) 3では、クラスの継承に「extends」というキーワードを使います。このextendsは、いままでのサンプルコードにも出てきましたね。連載第1回「Flashの要となるスクリプト言語『ActionScript』とは?」では、以下のようなコードが出てきたと思います。
public class Lesson1 extends Sprite { |
これは「SpriteクラスのフィールドやメソッドをLesson1クラスが継承している」という意味です。オブジェクト指向では、この場合のSpriteクラスを「スーパークラス」、Lesson1クラスを「サブクラス」と呼びます。クラスを継承する際の構文は以下です。
クラスの継承の構文 |
アクセス修飾子 class サブクラス名 extends スーパークラス名{ |
クラスの継承は主に、スーパークラスに対し機能やフィールドの追加、または機能の振る舞いを変えるときに使用します。そば屋に例えてイメージすると、「2代目店長は初代の味を継承しつつ、若者向けの新メニューを発案した」というようなパターンです。
実際にコーディングしてみるとどうなるでしょうか。ここで初代店長は「かけそば」「きつねそば」「たぬきそば」をフィールドとして持っており、調理する「cook」メソッドも持っているとします。
初代店長クラス |
package { |
それを継承した2代目店長クラスは新メニューとして「マヨネーズ蕎麦」を発案しました。
2代目店長クラス |
package { |
Secondクラスでは、Firstクラスに合ったフィールド「kake」「kitsune」「tanuki」、メソッドの「cook」はコーディングされていませんが、自動的に継承されます。このように、ActionScriptでは「extends」というキーワード1つで、スーパークラスにあるフィールドやメソッドを再度コーディングしなくても継承できます。
ただし、「cook」メソッドのアクセス修飾子が「private」だった場合、サブクラスには継承されません。アクセス修飾子の有効範囲は前回の「『クラス』って何なのよ?」で解説していますので、疑問を感じた方はもう一度見直してみてください。
ちなみに、SecondクラスのフィールドであるmayoSobaのアクセス修飾子には、privateを指定していますね。これは、もしSecondクラスを継承したThirdクラスを作った場合、フィールドmayoSobaは継承されないことを意味しています。
先ほどのFirstクラスとSecondクラスを見てみましょう。FirstクラスのcookメソッドはSecondクラスにも継承されます。cookメソッドは調理の処理を記述するメソッドとして用意しましたが、初代と2代目では調理方法が違うとしたらどうでしょう。
cook2などとメソッドを増やしていくのでしょうか。調理方法が大きく変わった場合であれば話は違いますが、少しだけ違うような場合はあまりいい方法には思えません。
例えば「2代目は最後にノリを散らすようにした」場合、cookのメソッドを継承したうえで、「最後にノリを散らす」という処理を付け加えたいです。こういった場合、AS3では「オーバーライド」という機能を使います。オーバーライドは直訳すると「優先する」という意味があり、スーパークラスのメソッドに処理を追加、または処理を書き換えることができます。
それでは、実際にFirstクラスのcookメソッドをオーバーライドしてみましょう。Firstクラスのcookメソッドは以下のようになっています。
protected function cook ( soba:ISoba ):void{ |
これをSecondクラスのメソッドでオーバーライドする場合は、以下のようになります。
override protected function cook ( soba:ISoba ):void { |
基本的には、スーパークラスのメソッドの頭に「override」というキーワードを付け加える形になります。
ここで注目していただきたいのが、「super.cook(soba);」の部分です。これはスーパークラスの「cookメソッドの実行」という意味で、この「super」というキーワードで呼び出すメソッドがないと、スーパークラスの処理が行われないことになり、ノリを散らしただけのものが出来上がってしまいますので、注意しましょう。
このように、継承やオーバーライド、アクセス修飾子の制御などによって、サブクラスでは必要な部分だけをコーディングすればいいことが分かったと思います。
これらの手法は「差分プログラミング」とも呼ばれていて、機能の拡張性やメンテナンス性を高めるためにとても便利な手法です。筆者は、これがオブジェクト指向が広く浸透した理由の1つだと思います。
次ページでは、インターフェイスやポリモーフィズムについて解説します。
Copyright © ITmedia, Inc. All Rights Reserved.