- 2009年8月 6日 02:12
- ActionScript 3.0
ネームスペース(名前空間)、使ってますか?実際便利なんですが、あんまり使っている人見ないですよね。
さて、ネームペースが付加されているメソッドのオーバーライドは、ただoverrideキーワードを付加するだけではうまくいかず、スコープに注意を払う必要があります。
クラスレベルのネームスペースを付加したメソッドを継承する
クラスレベルのスコープ。つまりclassキーワードで括られた範囲内のスコープに定義されたネームスペースをメソッドに定義した場合です。この場合の注意点は、スーパークラスで定義されているネームスペースは、サブクラスでもアクセスできなければならない。ということです。ActionScript 3.0の仕様では、internal(パッケージ内のみアクセス可)になり、それ以外にpublic(どこからでもアクセス可)、protected(サブクラスのみアクセス可)、private(外部からアクセス不可)の四つのアクセス制御指定子が存在します。ここでは、サブクラスでアクセスしなければならないため、protectedを指定します。あとは、いつもと同様にオーバーライドをかけるだけです。
パッケージレベルのネームスペースを定義する。
パッケージ内で共通してネームスペースを定義したい場合、パッケージレベルのスコープにネームスペースを定義します。このとき、asファイル名はクラスの時と同様、ネームスペース名と同一にします。
パッケージレベルのネームスペースを付加したメソッドを継承する
パッケージレベルのスコープ。packageキーワードで括られた範囲内のスコープに定義されたネームスペースをメソッドに定義した場合です。この場合の注意点は、パッケージ内でネームスペースを開かなければならない。ということです。なぜなら、ActionScriptはクラスレベルのスコープが対象になっているからです。そのため、use namespaceディレクティブを使用してネームスペースを開く必要があります。ややこしいですね。
ネームスペースを付加したメソッドのスーパーバージョンにアクセスする
見事ネームスペースを付加したメソッドのオーバーライドに成功したら、もちろんスーパーバージョンにアクセスしたくなりますよね。通常のオーバーライドでは、super.someMethod();のような形式をとりますが、ネームスーペースが付加されたメソッドでは、まずネームスペースをクッションにした上で呼び出さなければなりません。クッションには、super.SomeNameSpace::someMethod();という形式で行います。
package com{
namespace PACKAGE_LEVEL = "http://example.com/package_level";
}
package com {
import com.PACKAGE_LEVEL;
use namespace PACKAGE_LEVEL
public class SubClass extends SuperClass {
public function SubClass():void {
CLASS_LEVEL::test();
PACKAGE_LEVEL::test();
}
override CLASS_LEVEL function test():void {
super.CLASS_LEVEL::test();
trace("class_level::sub")
}
override PACKAGE_LEVEL function test():void {
super.PACKAGE_LEVEL::test();
trace("package_level::sub")
}
}
}
package com {
import com.PACKAGE_LEVEL;
use namespace PACKAGE_LEVEL
public class SuperClass {
protected namespace CLASS_LEVEL = "http://example.com/test2";
CLASS_LEVEL function test():void {
trace("class_level::super")
}
PACKAGE_LEVEL function test():void {
trace("package_level::super")
}
}
}



