AS3动态创建Vector

发表评论 阅读评论

很久没有写博客了,已经近乎荒废的程度了.不过从现在起还是要坚持写博客了,很多东西做了测试,没有记录下来,很容易就能忘记的.忘记在哪里看到有人说想动态创建Vector只是苦于语法上不允许,不过还是能够绕开语法检查的

// 请不要复制该代码,该代码不可用
var myClass:Class;
var v:Vector.<myClass> = new Vector.<myClass>();

上面的代码会报错”1046: 找不到类型,或者它不是编译时常数: Vector。"
Vector.<ClassName> 的类名不允许是一个变量, 必须是真正的类型名称才行,所以这样就不能动态创建Vector了.
功夫不负有心人,漫天梨花般的思考后,终于发现可以用反射实现动态创建Vector.

反射法创建Vector

/**
 * 获取一个动态Vector.<myclass>
 * @param   myClass
 * @param   appDomain myClass所在的应用程序域,如果null则为当前应用程序域
 * @return 一个动态Vector, null为myClass不存在
 */
function getVector(myClass:Class, appDomain:ApplicationDomain = null):*
{
    // 先获取元素类名
    var className:String = getQualifiedClassName(myClass);
    // 拼接成Vector类名
    var vectorName:String = "__AS3__.vec.Vector.<" + className + ">";
    appDomain ||= ApplicationDomain.currentDomain;
    if(appDomain.hasDefinition(vectorName))
    {
        return appDomain.getDefinition(vectorName);
    }

    // 该类不存在
    return null;
}

如果在当前应用程序域里则好办,如果在其他应用程序域里就需要将应用程序域传递过来.
当然也可以使用类的完全限定名来动态获取一个Vector,注意一定要在该类已经被加载到flash player后才能获取.

编后语

这样的需求可能会用来模拟C++的模板吧,但是比起模板是弱了很多,代码提示就完全没有了.

  1. alert("xxx"); | #1

    alert("xxx");

  2. lite3 | | #2

    没有特别的做手机主题.还是这个地址.

  3. 笑话据点 | | #3

    博客手机访问地址是什么?

  4. 麒麟联盟 | | #4

    你好。我来看你了!

  5. www.jvdian.com | | #5

    没有白看,还是有收获的,好!

  6. 淘宝返现十九亿 | | #6

    网站新手多多关照

  7. 托福 | #7

    还好,有点味道

  8. lite3 | | #8

    @Easily
    呵呵,就是 t = t || a; 的简写版

  9. Easily | | #9

    @lite3
    这样写好像更简洁,以前没有用过,可能我自己会这样写
    appDomain = appDomain ? appDomain : ApplicationDomain.currentDomain;
    其实这个有点像lua中变量的初始化
    t = t or {}

  10. lite3 | | #10

    @Easily
    呵呵,文档上都有的,||=就是一个运算符, 如果左边为转到boolean为flash就将右边的赋值给左边,否则还将左边的赋值给左边.要多看看帮助文档才好的,呵呵,我收藏页面里还有好多东西呢,欢迎查看.

  11. Easily | | #11

    appDomain ||= ApplicationDomain.currentDomain;
    这句很有意思,第一次知道这样的用法,博主能介绍一下这个用法吗

  12. 客厅沙发 | #12

    ok,帅

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部