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のプログラミングより抜粋
ドキュメント類は良く読まないと駄目ですね。
コメントを残す
コメントを投稿するにはログインしてください。