プロパティを使用してインスタンス自体のクラスへの参照を取得できますがconstructor
、祖先クラスにアクセスするには、とを使用する必要がdescribeType
ありgetDefinitionByName
ます。これらは強力ですが、コストがかかるため、これを使いすぎないように注意してください。
function callStaticAncestorProperty( instance:Object, staticProperty:String ):* {
var type:XML = describeType( instance );
var ret:* = instance.constructor[staticProperty];
for each(var extend:XML in type.extendsClass)
ret = ret ? ret : getStaticPropertyOrUndefined( extend, staticProperty );
return ret;
}
function getStaticPropertyOrUndefined( extend:XML, staticProperty:String ):* {
var clazz:Class = getDefinitionByName( extend.@type.toString().replace( "::", "." ) ) as Class;
return clazz[staticProperty] ? clazz[staticProperty] : undefined;
}
これにより、クラス自体にプロパティがあるかどうかがチェックされ、各スーパータイプが繰り返されます。見つかった最初の値が返されることに注意してください。つまり、サブクラスとスーパークラスの両方にこのプロパティがある場合、サブクラスの値が返されます。
編集
プロパティではなく、メソッド呼び出しについて質問していることに気づきました。これはほとんど同じように機能します。
function callStaticAncestorMethod( instance:Object, staticMethod:String ):void {
var type:XML = describeType( instance );
var method:Function = instance.constructor[staticMethod];
for each(var extend:XML in type.extendsClass)
method = method ? method : getStaticMethodOrUndefined( extend, staticMethod );
if (method) method();
}
function getStaticMethodOrUndefined( extend:XML, staticMethod:String ):Function {
var clazz:Class = getDefinitionByName( extend.@type.toString().replace( "::", "." ) ) as Class;
return clazz[staticMethod] ? clazz[staticMethod] : undefined;
}