旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

AS3で、コンストラクタで親クラスのプロパティを上書きしたい

2007年10月31日

ActionScript3で、「サブクラスのコンストラクタ内で、スーパークラスのプロパティを上書きする」ときにまつわるメモです。
【成功例1】

package {
public class SuperClass extends Object {
protected var _a:String = "SuperClass no property desu.";
public function SuperClass(a:String = ""):void {
if (a !== "") _a = a;
trace(_a);
};
};
};
package {
public class SubClass extends SuperClass {
public function SubClass():void {
super("SubClass no property desu.");
};
};
};

実行

new SubClass;

trace出力

SubClass no property desu.

スーパークラスの方で受け口を用意して、そこを介してプロパティを操作しています。

【成功例2】

package {
public class SuperClass extends Object {
protected var _a:String;
public function SuperClass():void {
trace(_a);
};
};
};
package {
public class SubClass extends SuperClass {
public function SubClass():void {
_a = "SubClass no property desu.";
super();
};
};
};

実行

new SubClass;

trace出力

SubClass no property desu.

サブクラス内でスーパークラスのプロパティを直接操作しています。

なお、サブクラスのコンストラクタにsuper()が無い場合は、コンストラクタの終了時にコンストラクタの開始時に引数なしのスーパークラスのコンストラクタが自動的に呼び出されるとのことです。
(参考: http://livedocs.adobe.com/flex/2_jp/langref/statements.html#super
・・・ので、SubClassのsuper()は書いても書かなくても同じ結果になります。書かないと開始時に呼ばれるので結果が変わります。

【失敗例1】
成功例2の方のSuperClassを以下に置き換える

package {
public class SuperClass extends Object {
// 宣言時に値を入れる
protected var _a:String = "SuperClass no property desu.";
public function SuperClass():void {
trace(_a);
};
};
};

trace出力

SuperClass no property desu.

super()実行時に、スーパークラスの初期値で上書きされてしまうようです。

【失敗例2】
成功例2の方のSubClassを以下に置き換える

package {
public class SubClass extends SuperClass {
public function SubClass():void {
// superを使ってアクセスしてみる
super._a = "SubClass no property desu.";
super();
};
};
};

コンパイルエラーが出る

/xxx/xxx/SubClass.as(x): col: xx エラー: super ステートメントは、このステートメント、super
ステートメント、return ステートメント、または throw ステートメントの後に続けることはできません。

なんでいけないんだろうなぁ?(未調査)

【失敗例3】
成功例2の方のSubClassを以下に置き換える

package {
public class SubClass extends SuperClass {
public function SubClass():void {
super._a = "SubClass no property desu.";
// コンパイルエラーにならないように super() を消してみる
};
};
};

trace出力

null

上書きはダメなのかなぁ。
trace(super._a) とか書くと、ちゃんとスーパークラスのプロパティを取得できるんですけども。

この辺の書き方が、PHP(4)ともJavaScriptともRubyとも違うので、どう書けばいいのか全くわかりません。
誰か教えて下さいませ。