Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Клонирование объектов (http://www.flasher.ru/forum/showthread.php?t=137678)

orcpochta 19.03.2010 19:17

Клонирование объектов
 
Пытаюсь разобраться как клонировать различные объекты и чувствую, что в голове какая-то каша - понимаю, что вообще не понимаю механизм происходящего.

Вот, вроде, можно написать такую функцию, для клонирования примитивных объектов (DisplayObject пока не рассматриваем) и массивов:

Код AS3:

function clone (obj:Object):*
{       
        registerClassAlias("alias", getDefinitionByName(getQualifiedClassName(obj)) as Class);
 
        var byteArr:ByteArray = new ByteArray( );
 
        byteArr.writeObject(obj);
        byteArr.position = 0;
 
        return byteArr.readObject( );
}

и даже можно отклонировать с помощью нее какой-нибудь примитивный класс:

Код AS3:

package
{
        public class MyClass
        {
                public var prop:int = 10;
 
                public function MyClass ( )
                {       
                }
        }
}

Далее, если конструктор клонируемого класса предполагает наличие параметров, то появляются первые подводные камни:

Код AS3:

package
{
        public class MyClass
        {
                public var prop:int;
 
                public function MyClass (param:int)
                {       
                        prop = param;
                }
        }
}

при попытке клонирования
Код AS3:

var my1:MyClass = new MyClass(10);
var my2:MyClass = clone(my1);

выкинет исключение, что неверное количество параметров - 0 параметров вместо 1 в конструкторе MyClass( ).
Т.е. получается восстановление из ByteArray по сути запускает сначала конструктор? Что вообще там происходит?
Проблема с неверным количеством параметров решается через присвоения дефолтного значения параметру конструктора:

Код AS3:

public function MyClass (param:int = 0)
{       
        prop = param;
}

в этом случае, как я понимаю, при клонировании запускается конструктор с дефолтным значением параметра, а потом свойству prop клона присваивается значение свойства prop клонируемого объекта?

Но если дальше еще чуть усложнить класс, то начинается петрушка, которой я не могу найти объяснения и не понимаю, что делать.

Код AS3:

package
{
        public class MyClass
        {
                public var prop:int;
                public var arr:Array;
 
                public function MyClass (param1:int = 1, param2:int = 1)
                {       
                        prop = param1;
                        arr = new Array(param1 * param2);
                }
        }
}

При попытке клонирования экземпляра этого класса:

Код AS3:

var my1:MyClass = new MyClass(10, 5);
var my2:MyClass = clone(my1);

получаем, что длина массива my1.arr.length равна 50, но длина массива my2.arr.length равно 0. Т.е. после вызова конструктора во время клонирования не происходит дублирования значения переменной arr клонируемого объекта в значение переменной arr клона (по крайней мере с массивами это не работает). Более того, длина массива в клоне почему-то и не становится равной 1, как можно было бы ожидать при использовании дефолтных значений параметров конструктора.

Для начала с этими моментами бы разобраться, а потом, если будут вопросы, я их буду задавать по ходу дальнейших попыток понять, что происходит.

iflamberg 19.03.2010 20:39

я недостаточно компетентен, чтобы рассказывать почему не получается и почему вызывается конструктор, но гарантированно вам скажу, что у вас ничего не получится с клонироваением таким образом.

Прийдется вам по старинке: создавать функцию объекта clone(), где создается новый instance того же объекта, копируются все поля, как надо, и instance возвращается.

orcpochta 19.03.2010 20:41

Цитата:

Сообщение от iflamberg (Сообщение 894276)
я недостаточно компетентен, чтобы рассказывать почему не получается и почему вызывается конструктор, но гарантированно вам скажу, что у вас ничего не получится с клонироваением таким образом.

Прийдется вам по старинке: создавать функцию объекта clone(), где создается новый instance того же объекта, копируются все поля, как надо, и instance возвращается.

это уже не клонирование, а сериализация)))

iflamberg 19.03.2010 21:01

что серьёзно? именно так и называется? ну те на, а я и не знал =)

NBVestal 20.03.2010 10:55

http://flasher.ru/forum/showpost.php...8&postcount=14 вот тут есть способ

orcpochta 20.03.2010 11:16

Я видел этот сообщение. Оно же самое есть, вроде, в блоге _etc. То, на что вы дали ссылку, мало чем отличается от того, что написал я. Только я привел примеры, где это копирование перестает работать. Обратите Внимание, что в примере, приведенном вами, клонируются объекты, которые по сути являются ассоциативными массивами и их дочерние элементы такие же простые структуры. Как я показал ранее, этот способ не работает над более сложными объектами, если я, конечно, где-то жестоко не наебакололся)))

Кстати, там в конце есть даже приписка, что данный метод хорошо подходит для чистых DTO/VO объектов - т.е., если я правильно понял, объектов, использующих описательную структуру вроде простых Object (ассоциативных массивов иже с ними {i: 1, j: 5}) и массивов.


Часовой пояс GMT +4, время: 22:39.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.