ActionScriptでオーバーライド、オーバロード
FlexSDKを使ってピュアAS3.0なコーディングをしているのだが、オブジェクト指向言語の基本機能をあれこれ使いたくなってくる。
余談ですが、こういうオブジェクト指向的な機能は基本ライブラリがしっかりしている方が使いたくなってくるんだな、と思うのです。たとえば、C++などでプログラムしていると基本クラスから作ることがあり、そこにある程度機能を詰め込んでしまうことが多い。しかし、基本ライブラリがあると、「ちょっと機能が足りない」ということが多く、そういうときに各種機能を使うことになると思うのです。
それはさておき、以下に、ActionScript3におけるオーバーライド、オーバーロードのやり方をメモしておきます。
オーバーライド
オーバーライド (override)とは、スーパークラスで定義されたメソッドをサブクラスで定義しなおし、動作を上書きすることである。
オーバーライド - Wikipedia
このブログエントリで詳しく説明されていますが、AS3にオーバーライド機能が実装されています。
以下に最低限必要な情報を含むコードだけ引用させていただきます。(詳細はリンク先を見てください)
protected override function method1():void { super.method1(); }
要点としては以下の3点。問題なく使えそうですね。
- overrideキーワードをつける
- アクセス修飾子を一致させる
- スーパークラスのメソッドは、super.として呼び出せる
オーバーロード
関数や演算子やメソッドの同一名や同一の演算子記号について複数定義し、利用時にプログラムの文脈に応じて選択することで複数の動作を行わせる仕組みである。
多重定義 - Wikipedia
結論から言うと、AS3にオーバーロード機能は実装されていません。
変数の型を動的に判断するような言語では実装は難しいというか、混乱を招きそうな部分ではあるので、他の言語(たとえばRuby等)でも実装されていなかったりします。
方法1
しかし例えば「http://snippets.libspark.org/trac/wiki/yossy/OverloadSupport」のような解決手段を考えている人もいます。
上記サイトのライブラリでは、「メソッドの引数別にnamespaceを使って、同名メソッドを定義する」という方法を実現しています。
方法2
もう一つの方法は、一つのメソッド定義内で、引数の型や数を参考にして処理を分岐する、という方法です。
まずは、引数の型を調べる方法から。
ActionScript3.0では型チェック機能(is演算子)が用意されています。以下に、ヘルプの「型チェック」という項目からコードを引用してみます。
function dynamicTest(xParam) { if (xParam is String) { var myStr:String = xParam; trace("String: " + myStr); } else if (xParam is Number) { var myNum:Number = xParam; trace("Number: " + myNum); } } dynamicTest(100); dynamicTest("one hundred");
次に、引数の数を調べる方法です。
引数の情報を調べる方法は、ヘルプの「関数パラメータ」内「argumentsオブジェクト」という項目に書かれています。ここを読むと、引数の数は、arguments.length プロパティを調べればよいことが分かります。
function traceArgArray(x:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // 出力 : // 1 // 2 // 3
方法3
他に方法はあるかな?
知っている方、コメント欄にて教えてください。