关于MC的复制一直都是人们抱怨Adobe的地方,他们不知道为什么一直不肯提供这样一个显然有必要的"Clone()"方法。按照官方手册上的解释,他们说只要用户用该MC相应的类重新new一个对象就可以了,但是那只能生成一个新的原始对象,并不能包含该MC中已经动态添加的各个Child,和用户期望的复制一个相同的MC不是一个概念。
面对用户诸多抱怨,Abobe一直回避这个问题,也不做任何解释。我也遇到过这个问题,而且看了很多国内外用户的讨论,最终我想明白了,Adobe不回应这个问题,是因为这个问题其实涉及到了Flash AS系统中的一个弱点(不能说是缺点),那就是:一个显示对象只能唯一作为某一个容器的Child,不能同时在多个容器里做Child。如果你把一个显示对象加入到其他的容器中,它就会自动从原容器中移除。回到我们说的MC复制问题上,如果用户克隆生成一个新的MC,并且把原MC里的孩子们也都加到新的MC里,那么那些孩子们就会从原来的MC里消失。为解决这个问题,就需要在加那些孩子们的时候也采用克隆的方式,这就形成了一个类似递归的模式,而显然Adobe不想在这里费心,所以他们就干脆不允许用户克隆MC,一了百了。
如果Adobe想偷懒,用户们是没脾气的,只能自己手动来实现这样一个功能了,思路如下——
Clone(MC):先用该MC的类生成一个新的原始对象,复制所有相关的参数设置,然后遍历原MC中的Children(只是孩子,不管孙子),对每个Child调用Clone(child)生成一个克隆加入到新的MC对象中。注意这里的Clone(MC)会形成嵌套递归调用。
其实对于Adobe设定的“把显示对象加入到其他容器就会自动从原容器中移除”的规则,我觉得是一个不良规则,因为没有任何理由一定要从原容器中移除,很可能只是为了偷懒。其实应该让用户可以选择是否保留在原容器中的对象,即为:当把显示对象加入到其他容器中时,如果设定保留标志参数为true,就会自动在原容器中保留一个原对象的克隆,并返回该克隆对象的引用供用户进行后续操作。如果用户认为不需要在原容器中保留,可以设该参数为false,或者在将来对返回的克隆引用设置 =null 就可以删除。
不管Adobe到底是出于什么目的,也不管他们以后会不会给你提供这样一个克隆函数,作为用户只能适应环境谋生存:如果你现在需要这个功能的话,自己写一个克隆的类来实现吧,方法就是我上面所说的那样。
关于MC的复制
最新推荐文章于 2024-02-25 21:15:04 发布