as3のコーディング中にクラス継承で疑問に思った点を検証しました。
疑問:コンストラクタにsuper()は不要か?
サブクラスのコンストラクタにsuper()を記述していないのに、スーパークラスのコンストラクタの内容が実行されている模様。
スーパークラスのコンストラクタを実行したい時には、サブクラスのコンストラクタの1行目にsuper()を書く必要があると思っていたんだけど、そうではないのか?
検証1
super()が無くてもスーパークラスのコンストラクタが呼ばれるか確認する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package { import flash.display.MovieClip; public class ExtendsTest1 extends MovieClip { public function ExtendsTest1() { var cla:ExtendsClass = new ExtendsClass(); } } } class BaseClass { public function BaseClass() { trace('BaseClass:(constractor)'); } } class ExtendsClass extends BaseClass { public function ExtendsClass() { trace("ExtendsClass:(constractor)"); } } |
出力ウィンドウには、以下のように表示されました。
BaseClass:(constractor)
ExtendsClass:(constractor)
サブクラスのコンストラクタにsuper()を記述しなくても、スーパークラスのコンストラクタが呼ばれているようです。
検証2
コンストラクタに引数が設定されていた場合も同様か?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package { import flash.display.MovieClip; public class ExtendsTest2 extends MovieClip { public function ExtendsTest2() { var cla:ExtendsClass = new ExtendsClass(10); } } } class BaseClass { public function BaseClass(a:Number) { trace('BaseClass:(constractor)', a); } } class ExtendsClass extends BaseClass { public function ExtendsClass(a:Number) { trace("ExtendsClass:(constractor)", a); } } |
以下のようなコンパイルエラーが発生した。
行22 1203:基本クラス ExtendsTest2.as$0:BaseClassにデフォルトコンストラクタがありません。
24行目に「super(a);」を追加した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package { import flash.display.MovieClip; public class ExtendsTest3 extends MovieClip { public function ExtendsTest3() { var cla:ExtendsClass = new ExtendsClass(10); } } } class BaseClass { public function BaseClass(a:Number) { trace('BaseClass:(constractor)', a); } } class ExtendsClass extends BaseClass { public function ExtendsClass(a:Number) { super(a); trace("ExtendsClass:(constractor)", a); } } |
出力ウィンドウには、以下のように表示されました。
BaseClass:(constractor) 10
ExtendsClass:(constractor) 10
コンストラクタに引数がある場合は、super()を記述する必要があるようです。
検証3
super()を記述する位置は1行目に限られるのか?
前述ExtendsTest3.asの24行目と25行目を入れ替えてみました。
出力ウィンドウには、以下のように表示されました。
ExtendsClass:(constractor) 10
BaseClass:(constractor) 10
1行目でなくても問題なく動くようです。こういう使い方も、場合によっては必要なのかな…
追記:2012/08/30
ActionScript3のドキュメントを見ていたら以下のような記述がありました。
コンストラクタは、super() ステートメントを使用して直接のスーパークラスのコンストラクタを明示的に呼び出すことができます。スーパークラスのコンストラクタを明示的に呼び出さない場合は、コンパイラによってコンストラクタ本体の最初のステートメントの前に呼び出しが自動的に挿入されます。
※ADOBE ACTIONSCRIPT3.0のプログラミングより抜粋
ドキュメント類は良く読まないと駄目ですね。
コメントを残す
コメントを投稿するにはログインしてください。