アプリケーションでのポリモーフィズムの使用

オブジェクト指向プログラミングでは、"ポリモーフィズム" と呼ばれる手法を使用して、個々のクラス間の違いを表現することができます。具体的には、クラスが、対応するスーパークラスのメソッドをオーバーライドして、これらのメソッドの特殊な実装を定義することになります。

たとえば、play() メソッドと sleep() メソッドを持つ Mammal というクラスを定義したとします。次に、Mammal クラスを継承する Cat、Monkey、および Dog というサブクラスを作成します。これらのサブクラスは、個々の動物に固有の習性を反映させるために、Mammal クラスの play() メソッドをオーバーライドできます。たとえば、Monkey は木にぶら下がる play() メソッドを、Cat は毛糸の玉を追いかける play() メソッドを、Dog はボールを取りに行く play() メソッドをそれぞれ実装するといったことが可能です。sleep() の動作はこれらの動物にほぼ共通しているため、スーパークラスの実装を利用することができます。次の手順では、Flash でのこの例について説明します。

アプリケーションでポリモーフィズムを使用するには :

  1. 新しい ActionScript ドキュメントを作成し、Mammal.as という名前で保存します。

    このドキュメントは、この後の手順で作成するいくつかの動物クラスの基本クラスです。

  2. "Mammal.as" で、スクリプトウィンドウに次の ActionScript コードを入力します。
    class Mammal {
        private var _gender:String;
        private var _name:String = "Mammal";
    
        // コンストラクタ
        public function Mammal(gender:String) {
            this._gender = gender;
        }
    
        public function toString():String {
            return "[object " + speciesName + "]";
        }
        public function play():String {
            return "Chase another of my kind.";
        }
        public function sleep():String {
            return "Close eyes.";
        }
    
        public function get gender():String {
            return this._gender;
        }
        public function get speciesName():String {
            return this._name;
        }
        public function set speciesName(value:String):Void {
            this._name = value;
        }
    }
    

    前のクラスは、_gender_name という 2 つのプライベート変数を定義します。これらは、動物の性別と哺乳類タイプを格納するために使用されます。次に、Mammal コンストラクタが定義されます。このコンストラクタは、1 つのパラメータ gender を取り、このパラメータを使用して、前に定義したプライベート変数 _gender を設定します。さらに、toString()play()sleep() という 3 つのパブリックメソッドも指定されます。これらはそれぞれストリングオブジェクトを返します。最後の 3 つのメソッドは、哺乳類の _gender プロパティと _name プロパティの getter メソッドと setter メソッドです。

  3. ActionScript ドキュメントを保存します。

    このクラスは、この後に作成する Cat クラス、Dog クラス、Monkey クラスのスーパークラスとして機能します。Mammal クラスの toString() メソッドを使用して、Mammal インスタンス (または Mammal クラスを拡張する任意のインスタンス) のストリング表現を表示することができます。

  4. 新しい ActionScript ファイルを作成し、Cat.as という名前で、手順 1 で作成した "Mammal.as" クラスファイルと同じディレクトリに保存します。
  5. "Cat.as" で、スクリプトウィンドウに次の ActionScript コードを入力します。
    class Cat extends Mammal {
        // コンストラクタ
        public function Cat(gender:String) {
            super(gender);
            speciesName = "Cat";
        }
        
        public function play():String {
            return "Pounce a ball of yarn.";
        }
    }
    

    Mammal スーパークラスの play() メソッドをオーバーライドします。Cat クラスは、コンストラクタと play() メソッドという 2 つのメソッドのみを定義します。Cat クラスは Mammal クラスを拡張するので、Mammal クラスのメソッドとプロパティは、Cat クラスによって継承されます。オーバーライドの詳細については、メソッドとプロパティのオーバーライドを参照してください。

  6. ActionScript ドキュメントの変更を保存します。
  7. 新しい ActionScript ドキュメントを作成し、Dog.as という名前で 前の 2 つのクラスファイルと同じディレクトリに保存します。
  8. "Dog.as" で、スクリプトウィンドウに次の ActionScript コードを入力します。
    class Dog extends Mammal {
        // コンストラクタ
        public function Dog(gender:String) {
            super(gender);
            speciesName = "Dog";
        }
    
        public function play():String {
            return "Fetch a stick.";
        }
    }
    

    Dog クラスは、Cat クラスと構造が非常によく似ていますが、いくつかの値が変更されています。Dog クラスも Mammal クラスを拡張するので、すべてのメソッドとプロパティを継承します。Dog コンストラクタは 1 つのプロパティ gender を取り、Dog クラスの親クラスである Mammal に渡します。speciesName 変数もオーバーライドされ、Dog というストリングに設定されます。play() メソッドも親クラスからオーバーライドされます。

  9. ActionScript ドキュメントの変更を保存します。
  10. 他のファイルと同じディレクトリ内に別の ActionScript ドキュメントを作成し、Monkey.as という名前で保存します。
  11. "Monkey.as" で、スクリプトウィンドウに次の ActionScript コードを入力します。
    class Monkey extends Mammal {
        // コンストラクタ
        public function Monkey(gender:String) {
            super(gender);
            speciesName = "Monkey";
        }
    
        public function play():String {
            return "Swing from a tree.";
        }
    }
    

    前の 2 つのクラス (Cat と Dog) と同じように、Monkey クラスは Mammal クラスを拡張します。Monkey クラスのコンストラクタは、Mammal クラスのコンストラクタを呼び出し、Mammal クラスのコンストラクタに gender を渡し、speciesNameMonkey というストリングに設定します。Monkey クラスも、play() メソッドの動作をオーバーライドします。

  12. ActionScript ドキュメントの変更を保存します。
  13. これで Mammal クラスの 3 つのサブクラスを作成しました。次に mammalTest.fla という新しい Flash ドキュメントを作成します。
  14. "mammalTest.fla" ドキュメントで、メインタイムラインのフレーム 1 に次の ActionScript コードを入力します。
    var mammals_arr:Array = new Array();
    this.createTextField("info_txt", 10, 10, 10, 450, 80);
    info_txt.html = true;
    info_txt.multiline = true;
    info_txt.border = true;
    info_txt.wordWrap = true;
    
    createMammals()
    createReport()
    
    function createMammals():Void {
        mammals_arr.push(new Dog("Female"));
        mammals_arr.push(new Cat("Male"));
        mammals_arr.push(new Monkey("Female"));
        mammals_arr.push(new Mammal("Male"));
    }
    
    function createReport():Void {
        var i:Number;
        var len:Number = mammals_arr.length;    
        // タブストップを使用して、Mammal の情報を 4 列の HTML テキストに表示する。
        info_txt.htmlText = "<textformat tabstops='[110, 200, 300]'>";
        info_txt.htmlText += "<b>Mammal\tGender\tSleep\tPlay</b>";
        for (i = 0; i < len; i++) {
            info_txt.htmlText += "<p>" + mammals_arr[i].speciesName 
                    + "\t" + mammals_arr[i].gender 
                    + "\t" + mammals_arr[i].sleep()
                    + "\t" + mammals_arr[i].play() + "</p>";
            // trace ステートメントで Mammal.toString() メソッドを呼び出す。
            trace(mammals_arr[i]); 
        }
        info_txt.htmlText += "</textformat>";
    }
    

    "mammalTest.fla" のコードは、前のクラスよりも少々複雑です。最初に、3 つの動物クラスを呼び出します。

  15. Flash ドキュメントを保存し、[制御]-[ムービープレビュー] を選択して、ドキュメントをテストします。

    Mammal の情報が、ステージ上のテキストフィールドに表示され、次のテキストが [出力] パネルに表示されます。

    [object Dog]
    [object Cat]
    [object Monkey]
    [object Mammal]
    


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000825.html