9

我想克隆一个 Canvas 对象,该对象包含一个具有多个几何形状的 Degrafa Surface。

我尝试了天真的方法:

return ObjectUtil.copy(graph_area) as Canvas;

导致错误:

TypeError: Error #1034: Type Coercion failed: cannot convert Object@63b1b51 to com.degrafa.geometry.Geometry.
TypeError: Error #1034: Type Coercion failed: cannot convert Object@63b1039 to com.degrafa.geometry.Geometry.
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at mx.core::Container/addChildAt()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2196]
    at mx.core::Container/addChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2140] ...
4

5 回答 5

9

你想要的称为深拷贝,生成一个与原始信息相同的新实例。

我知道如何做到这一点的唯一方法是使用 ByteArray 如下:

private function clone(source:Object):*
{
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(source);
    buffer.position = 0;
    return buffer.readObject();
}

AS3 真的缺少 Object.clone()...

于 2009-02-20T09:59:13.393 回答
8

对象工具

静态方法ObjectUtil.copy()是 AS3 的“Object.clone()”:

public static function copy(value:Object):Object

复制指定的 Object 并返回对副本的引用。该副本是使用本机序列化技术制作的。这意味着在复制期间将尊重自定义序列化。

此方法设计用于复制数据对象,例如集合的元素。它不适用于复制 UIComponent 对象,例如 TextInput 控件。如果要创建特定 UIComponent 对象的副本,可以创建组件的子类并实现 clone() 方法或其他方法来执行复制。

于 2010-01-04T19:39:18.393 回答
1

我发现自己在尝试更像这样的东西,唉,它似乎仍然没有复制 TextArea(又名 UI 对象)......

public function duplicateObject(sourceObject:*, targetObject:*):void {
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(sourceObject);
    buffer.position = 0;
    targetObject = buffer.readObject();
}
于 2009-06-02T10:08:52.400 回答
1

我遇到了同样的问题(对于我创建的 NamedEntity 接口),在这里寻找答案,但只有调用 registerClassAlias 方法才能正常工作(我从http://richapps.de/?p=34获取) . 就像这样:

public static function clone(namedEntity:NamedEntity):NamedEntity {
registerClassAlias('test',ReflectionUtil.classByObject(namedEntity));
var returnObject:NamedEntity = ObjectUtil.copy(namedEntity) as NamedEntity;
}
于 2009-10-17T02:30:07.387 回答
0

我认为 ObjectUtil.copy 不适用于克隆画布。根据弹性文档:

Copy 此方法设计用于复制数据对象,例如集合的元素。它不适用于复制 UIComponent 对象,例如 TextInput 控件。如果要创建特定 UIComponent 对象的副本,可以创建组件的子类并实现 clone() 方法或其他方法来执行复制。

于 2009-05-27T08:49:24.820 回答