我正在用Flash编写一个iOS游戏,我需要一种克隆多态对象的方法。我有BaseClass,SubClass1,SubClass2 (等等)我需要一个BaseClass中的克隆()方法,它将创建当前对象的副本,而不带条件,例如
var obj:BaseClass;
if(this is SubClass1) {
obj = new SubClass1();
}else if(this is SubClass2) {
obj = new SubClass2();
}else...我需要一种方法来创建一个对象,并创建这个对象的确切字节(是的,一个浅拷贝就足够了)。我看过:
http://actionscripthowto.com/how-to-clone-objects-in-as3/
但似乎都不起作用。可能无法在AIR 3.3中获得iOS SDK。(它们编译,但代码在我的例子中不起作用)
还有其他方法吗?还是有人在空中为iOS克隆了一个物体?
谢谢,
能。
发布于 2012-07-22 14:32:18
除非类只包含原始值(即简单的数据结构),否则不能用ActionScript逐位克隆。这就是您在ByteArray中链接到的这个问题的答案方法的用途--但是当您处理复杂类型,特别是显示对象时,您很快就会达到极限(我想,您已经意识到了)。
因此,这或多或少给您留下了两个选项:
getQualifiedClassName()和getDefinitionByName()将在那里帮助您,如果您需要的不仅仅是名称,describeType()。但是,这也有其局限性:private字段将不可用(它们不会出现在describeType()提供的信息中),为了避免出现性能问题,您必须使用某种缓存。幸运的是,如3通用-反射已经解决了这一问题,因此实现完全功能浅拷贝机制所需的其余内容并不太复杂。
创建如下新实例:
变量newObject:* = new Type.forInstance( myObject ).clazz();
然后迭代所有访问器、变量和动态属性,并分配旧实例的值,我已经为我正在开发的开源框架实现了这样的方法。您可以在github下载或发送它。目前还没有任何文档,但是它的使用就像编写一样简单:
*= shallowCopy( myObject );
我还有一个copy()方法,它创建了一个真正的深拷贝。然而,除了数据结构(尽管是较大的数据结构)之外,还没有对此进行过测试,因此您可以自行使用;)graphics的内容绘制到新的位图即可。
函数bitmapCopy(源:Sprite):位图{ source.cacheAsBitmap = true;var bitmapData:BitmapData =新BitmapData( source.width,source.height,true,0xFFFFFF );bitmapData.draw(源,新矩阵(),null,真);返回新位图( bitmapData,PixelSnapping.AUTO,true );}发布于 2012-07-22 10:48:21
您需要在基类中创建一个抽象的clone方法,并为每个子类实现它。在特定的实现中,您将把对象的所有属性复制到新的属性中。
public class BaseClass {
public function clone():BaseClass
{
// throw an error so you quickly see the places where you forgot to override it
throw new Error("clone() should be overridden in subclasses!");
return null;
}
}
public class Subclass1 extends BaseClass {
public override function clone():BaseClass
{
var copy:Subclass1 = new Subclass1();
copy.prop1 = prop1;
copy.prop2 = prop2;
// .. etc
return copy;
}
}如果要创建clone的通用默认实现,可以使用describeType访问这些属性并复制它们:
public function clone():BaseClass
{
var defn:XML = describeType(this);
var clsName:String = defn.@name;
var cls:Class = getDefinitionByName(clsName) as Class;
var inst:* = new cls();
for each(var prop:String in (defn.variable + defn.accessor.(@access == 'readwrite')).@name )
{
inst[prop] = this[prop];
}
return inst;
}这方面的主要问题是,describeType XML可能会变得相当大--特别是当您处理扩展DisplayObject的对象时。这可能需要大量内存,而且在iOS上速度很慢。
https://stackoverflow.com/questions/11599262
复制相似问题