[AS2.0] 継承って何?

継承だよ! :bear:
でも、継承って何? :bouzu:

謎の呪文 extends をようやく使うことができるだよ。 :boy:

[ActionScript2.0]
継承 / スーパークラス / サブクラス


失敗を恐れず、とにかく、試してみよう! :boy:
frogMotion.fla, Frog.as, Kaeru.as を同階層に用意する。

frogMotion.fla
var frog:Frog = new Frog(1, "A");
var frogInfo:String = frog.showInfo();
frog_txt.text = "[frog] "+frogInfo;

var kaeru:Kaeru = new Kaeru(2, "B");
var kaeruInfo:String = kaeru.showInfo();
kaeru_txt.text = "[kaeru] "+kaeruInfo;

Frog.as
class Frog {
  // プロパティ
  private var _id:Number;
  private var _type:String;
  private var _size:Number = 100;

  // コンストラクタ
  public function Frog(id:Number, type:String, size:Number) {
    this._id = id;
    this._type = type;
    if (size) {
      this._size = size;
    }
  }

  // メソッド
  public function showInfo():String {
    var str:String = "frogID: "+this._id+", frogType: "+this._type+", frogSize: "+this._size;
    return str;
  }
}

Kaeruクラスは、Frogクラスを継承するので、Frogクラスがスーパークラスで、Kaeruクラスはサブクラス。 :hakase:


(1) プロパティ・メソッドの継承

Kaeru.as
class Kaeru extends Frog {
  // コンストラクタ
  public function Kaeru(id:Number, type:String, size:Number) {
    this._id = id;
    this._type = type;
    if (size) {
      this._size = size;
    }
  }
}

This movie requires Flash Player 9.0.0


うおっ! 😮
プロパティやメソッドを継承しているようだ。


(2) スーパークラスのコンストラクタを呼び出す (super)

Kaeru.as
class Kaeru extends Frog {
  // コンストラクタ
  public function Kaeru(id:Number, type:String, size:Number) {
    super(id, type, size);
  }
}

This movie requires Flash Player 9.0.0


やたー! :doki:


(3) プロパティの上書き

Kaeru.as
class Kaeru extends Frog {
  // プロパティ
  private var _size:Number = 80;

  // コンストラクタ
  public function Kaeru(id:Number, type:String, size:Number) {
    super(id, type, size);
  }
}

This movie requires Flash Player 9.0.0


_size を追加してみると、プロパティが上書きされてるみたいだ。

ここで、さらに…。
Kaeru.as
class Kaeru extends Frog {
  // プロパティ
  private static var _size:Number = 80;

  // コンストラクタ
  public function Kaeru(id:Number, type:String, size:Number) {
    super(id, type, size);
    if (size) {
      this._size = size;
    }
  }
}
としてみると、
**エラー**
静的メンバーには、クラスを通してのみ直接アクセスできます
  this._size = size;
と、コンパイルエラーが出て、ちゃんと怒られる。 :bouzu:


(4) メソッドの上書き

Kaeru.as
class Kaeru extends Frog {
  // メソッド
  public function showInfo():String {
    var str:String = "ID: "+this._id+", type: "+this._type+", size: "+this._size;
    return str;
  }

  // コンストラクタ
  public function Kaeru(id:Number, type:String, size:Number) {
    super(id, type, size);
  }
}

This movie requires Flash Player 9.0.0


showInfo() を追加してみると、メソッドが上書きされてるみたいだ。

ここで、さらに…。
Kaeru.as
class Kaeru extends Frog {
  // メソッド
  private function showInfo():String {
    var str:String = "ID: "+this._id+", type: "+this._type+", size: "+this._size;
    return str;
  }

  // コンストラクタ
  public function Kaeru(id:Number, type:String, size:Number) {
    super(id, type, size);
  }
}
としてみると、
**エラー**
メンバーがプライベートで、アクセスできません
  var kaeruInfo:String = kaeru.showInfo();
と、コンパイルエラーが出て、ちゃんと怒られる。 :bouzu:


まだ整理は全然ついていないが、extends, super を見ても、もう泣きべそはかかないぞ。 :boy:


参考資料「クラスの作成と使用


[修正] (06/09/14 Thu 03:54)
:banana: [AS2.0] クラスはどう記述する? により、スクリプトを修正。