devlog [naru design]

プログラミングやテクニカルな内容の覚え書き。

as3のコーディング中にクラス継承で疑問に思った点を検証しました。

疑問:コンストラクタにsuper()は不要か?

サブクラスのコンストラクタにsuper()を記述していないのに、スーパークラスのコンストラクタの内容が実行されている模様。
スーパークラスのコンストラクタを実行したい時には、サブクラスのコンストラクタの1行目にsuper()を書く必要があると思っていたんだけど、そうではないのか?

検証1

super()が無くてもスーパークラスのコンストラクタが呼ばれるか確認する。

出力ウィンドウには、以下のように表示されました。

BaseClass:(constractor)
ExtendsClass:(constractor)

サブクラスのコンストラクタにsuper()を記述しなくても、スーパークラスのコンストラクタが呼ばれているようです。

検証2

コンストラクタに引数が設定されていた場合も同様か?

以下のようなコンパイルエラーが発生した。

行22 1203:基本クラス ExtendsTest2.as$0:BaseClassにデフォルトコンストラクタがありません。

24行目に「super(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のプログラミングより抜粋

ドキュメント類は良く読まないと駄目ですね。

Pocket

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Trackback URL: