首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何克隆对象而不知道iOS在AIR中的确切类型

如何克隆对象而不知道iOS在AIR中的确切类型
EN

Stack Overflow用户
提问于 2012-07-22 09:53:05
回答 2查看 389关注 0票数 2

我正在用Flash编写一个iOS游戏,我需要一种克隆多态对象的方法。我有BaseClass,SubClass1,SubClass2 (等等)我需要一个BaseClass中的克隆()方法,它将创建当前对象的副本,而不带条件,例如

代码语言:javascript
复制
var obj:BaseClass;
if(this is SubClass1) { 
   obj = new SubClass1(); 
}else if(this is SubClass2) {
   obj = new SubClass2();
}else...

我需要一种方法来创建一个对象,并创建这个对象的确切字节(是的,一个浅拷贝就足够了)。我看过:

AS3 -克隆一个对象

As3复制对象

http://actionscripthowto.com/how-to-clone-objects-in-as3/

但似乎都不起作用。可能无法在AIR 3.3中获得iOS SDK。(它们编译,但代码在我的例子中不起作用)

还有其他方法吗?还是有人在空中为iOS克隆了一个物体?

谢谢,

能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-22 14:32:18

除非类只包含原始值(即简单的数据结构),否则不能用ActionScript逐位克隆。这就是您在ByteArray中链接到的这个问题的答案方法的用途--但是当您处理复杂类型,特别是显示对象时,您很快就会达到极限(我想,您已经意识到了)。

因此,这或多或少给您留下了两个选项:

  1. 创建一个新对象并复制其所有字段和属性。 如果您需要行为和字段值,并且不使用任何绘图方法(即,您不能以这种方式复制矢量图形),这就是方法。在不知道它的确切类型的情况下创建一个新的类实例可以用一种通用的方式使用反射,getQualifiedClassName()getDefinitionByName()将在那里帮助您,如果您需要的不仅仅是名称,describeType()。但是,这也有其局限性:private字段将不可用(它们不会出现在describeType()提供的信息中),为了避免出现性能问题,您必须使用某种缓存。幸运的是,如3通用-反射已经解决了这一问题,因此实现完全功能浅拷贝机制所需的其余内容并不太复杂。 创建如下新实例: 变量newObject:* = new Type.forInstance( myObject ).clazz(); 然后迭代所有访问器、变量和动态属性,并分配旧实例的值,我已经为我正在开发的开源框架实现了这样的方法。您可以在github下载或发送它。目前还没有任何文档,但是它的使用就像编写一样简单: *= shallowCopy( myObject ); 我还有一个copy()方法,它创建了一个真正的深拷贝。然而,除了数据结构(尽管是较大的数据结构)之外,还没有对此进行过测试,因此您可以自行使用;)
  2. 创建位图副本。 如果有矢量图形,这通常比重新创建图像更容易:只需将对象的graphics的内容绘制到新的位图即可。 函数bitmapCopy(源:Sprite):位图{ source.cacheAsBitmap = true;var bitmapData:BitmapData =新BitmapData( source.width,source.height,true,0xFFFFFF );bitmapData.draw(源,新矩阵(),null,真);返回新位图( bitmapData,PixelSnapping.AUTO,true );}
票数 1
EN

Stack Overflow用户

发布于 2012-07-22 10:48:21

您需要在基类中创建一个抽象的clone方法,并为每个子类实现它。在特定的实现中,您将把对象的所有属性复制到新的属性中。

代码语言:javascript
复制
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访问这些属性并复制它们:

代码语言:javascript
复制
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上速度很慢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11599262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档