Как клонировать объект во Flex? - PullRequest
9 голосов
/ 19 февраля 2009

Я хочу клонировать объект Canvas, который содержит поверхность Degrafa с несколькими формами геометрии.

Я попробовал наивный подход:

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

Ответы [ 5 ]

9 голосов
/ 20 февраля 2009

То, что вы хотите, называется глубокой копией, создайте новый экземпляр с той же информацией, что и оригинал.

Единственный способ, которым я знаю, как это сделать, это использовать ByteArray следующим образом:

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

AS3 действительно не хватает Object.clone () ...

8 голосов
/ 04 января 2010

ObjectUtil

Статический метод ObjectUtil.copy () - это "Object.clone ()" AS3:

public static function copy(value:Object):Object

Копирует указанный Объект и возвращает ссылку на копию. копия сделана с использованием нативного Техника сериализации. Это означает что пользовательская сериализация будет соблюдается при копировании.

Этот метод предназначен для копирования объекты данных, такие как элементы коллекция. Не предназначен для копирование объекта UIComponent, такого как элемент управления TextInput. Если хотите создавать копии конкретного UIComponent объекты, вы можете создать подкласс компонент и реализовать клон () метод или другой метод для выполнения копия.

1 голос
/ 17 октября 2009

У меня возникла та же проблема (для интерфейса 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;
}
1 голос
/ 02 июня 2009

Я обнаружил, что пытаюсь сделать что-то более похожее на это, увы, похоже, что по-прежнему не копируется TextArea (он же объект UI) ...

public function duplicateObject(sourceObject:*, targetObject:*):void {
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(sourceObject);
    buffer.position = 0;
    targetObject = buffer.readObject();
}
0 голосов
/ 27 мая 2009

Я не думаю, что ObjectUtil.copy будет работать для клонирования холста. Согласно гибкому документу:

Копия Этот метод предназначен для копирования объектов данных, таких как элементы коллекции. Он не предназначен для копирования объекта UIComponent, такого как элемент управления TextInput. Если вы хотите создать копии определенных объектов UIComponent, вы можете создать подкласс компонента и реализовать метод clone () или другой метод для выполнения копирования.

...