Flash CS3 ドキュメンテーション |
|||
| ActionScript 2.0 の学習 > 継承 > アプリケーションでのポリモーフィズムの使用 | |||
オブジェクト指向プログラミングでは、"ポリモーフィズム" と呼ばれる手法を使用して、個々のクラス間の違いを表現することができます。具体的には、クラスが、対応するスーパークラスのメソッドをオーバーライドして、これらのメソッドの特殊な実装を定義することになります。
たとえば、play() メソッドと sleep() メソッドを持つ Mammal というクラスを定義したとします。次に、Mammal クラスを継承する Cat、Monkey、および Dog というサブクラスを作成します。これらのサブクラスは、個々の動物に固有の習性を反映させるために、Mammal クラスの play() メソッドをオーバーライドできます。たとえば、Monkey は木にぶら下がる play() メソッドを、Cat は毛糸の玉を追いかける play() メソッドを、Dog はボールを取りに行く play() メソッドをそれぞれ実装するといったことが可能です。sleep() の動作はこれらの動物にほぼ共通しているため、スーパークラスの実装を利用することができます。次の手順では、Flash でのこの例について説明します。
このドキュメントは、この後の手順で作成するいくつかの動物クラスの基本クラスです。
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 メソッドです。
このクラスは、この後に作成する Cat クラス、Dog クラス、Monkey クラスのスーパークラスとして機能します。Mammal クラスの toString() メソッドを使用して、Mammal インスタンス (または Mammal クラスを拡張する任意のインスタンス) のストリング表現を表示することができます。
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 クラスによって継承されます。オーバーライドの詳細については、メソッドとプロパティのオーバーライドを参照してください。
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() メソッドも親クラスからオーバーライドされます。
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 を渡し、speciesName を Monkey というストリングに設定します。Monkey クラスも、play() メソッドの動作をオーバーライドします。
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 つの動物クラスを呼び出します。
Mammal の情報が、ステージ上のテキストフィールドに表示され、次のテキストが [出力] パネルに表示されます。
[object Dog] [object Cat] [object Monkey] [object Mammal]
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート
現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000825.html