Home » 程序开发 » Flash » AS3动态创建Vector

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. |

    ok,帅

  2. | |

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

  3. | |

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

  4. | |

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

  5. | |

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

  6. |

    还好,有点味道

  7. | |

    网站新手多多关照

  8. | |

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

  9. | |

    你好。我来看你了!

  10. | |

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

  11. | |

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

  12. |

    alert("xxx");

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