AS3:如何用类实现instanceOf?

时间:2013-12-28 16:15:00

标签: actionscript-3 flash class flex casting

我想实现这个方法

function isInstance(a:Class, b:Class):Boolean;

这就是AS3如何使用Classes。 请注意MovieClip扩展Sprite。

trace(MovieClip is Sprite); // false
trace(Sprite is MovieClip); // false
trace(Sprite is Sprite); // false
trace(Sprite is Object); // true

我一直在尝试下一个代码,但它无效:

/**
* return if instance of class 'a' can be cast to instant of class 'b'
*/
private function isInstance(a:Class, b:Class):Boolean{
    var superclass:Class = a;
    do {
        if (superclass == b) {
            return true;
        }
        superclass = getSuperClass(a);
    } while (superclass != null);

    return false;
}

private function getSuperClass(claz:Class):Class{
    var qualifiedSuperclassName:String = getQualifiedSuperclassName(claz);
    var returnValue:Class = getDefinitionByName(qualifiedSuperclassName) as Class;
    return returnValue;
}

2 个答案:

答案 0 :(得分:0)

在此site中找到解决方案。

这很简单:

private function isSubclassOfSkyboy(a:Class, b:Class): Boolean
{
    if (int(!a) | int(!b)) return false;
    return (a == b || a.prototype instanceof b);
}

此处使用了 instanceof ,已从as3弃用。据我所知,在这种情况下他不能被 取代,但如果我错了,请纠正我。在评论之前,请以任何方式阅读文章。

答案 1 :(得分:0)

来自ActionScript docs

  

应该使用is运算符而不是instanceof运算符   手动类型检查,因为表达式x instanceof y   检查x的原型链是否存在y(并且在   ActionScript 3.0,原型链没有提供完整的   继承层次结构的图片。)

他们的样本:

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

听起来我觉得你正在努力做到这一点。