![]() |
|
||||||||||
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Пытаюсь разобраться как клонировать различные объекты и чувствую, что в голове какая-то каша - понимаю, что вообще не понимаю механизм происходящего.
Вот, вроде, можно написать такую функцию, для клонирования примитивных объектов (DisplayObject пока не рассматриваем) и массивов: 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( ); } package { public class MyClass { public var prop:int = 10; public function MyClass ( ) { } } } package { public class MyClass { public var prop:int; public function MyClass (param:int) { prop = param; } } } выкинет исключение, что неверное количество параметров - 0 параметров вместо 1 в конструкторе MyClass( ). Т.е. получается восстановление из ByteArray по сути запускает сначала конструктор? Что вообще там происходит? Проблема с неверным количеством параметров решается через присвоения дефолтного значения параметру конструктора: в этом случае, как я понимаю, при клонировании запускается конструктор с дефолтным значением параметра, а потом свойству prop клона присваивается значение свойства prop клонируемого объекта? Но если дальше еще чуть усложнить класс, то начинается петрушка, которой я не могу найти объяснения и не понимаю, что делать. 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); } } } получаем, что длина массива my1.arr.length равна 50, но длина массива my2.arr.length равно 0. Т.е. после вызова конструктора во время клонирования не происходит дублирования значения переменной arr клонируемого объекта в значение переменной arr клона (по крайней мере с массивами это не работает). Более того, длина массива в клоне почему-то и не становится равной 1, как можно было бы ожидать при использовании дефолтных значений параметров конструктора. Для начала с этими моментами бы разобраться, а потом, если будут вопросы, я их буду задавать по ходу дальнейших попыток понять, что происходит.
__________________
скриптограф Последний раз редактировалось orcpochta; 20.03.2010 в 02:24. |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 1,651
|
я недостаточно компетентен, чтобы рассказывать почему не получается и почему вызывается конструктор, но гарантированно вам скажу, что у вас ничего не получится с клонироваением таким образом.
Прийдется вам по старинке: создавать функцию объекта clone(), где создается новый instance того же объекта, копируются все поля, как надо, и instance возвращается.
__________________
мой пустой блог |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Цитата:
__________________
скриптограф |
|
|||||
|
Регистрация: Mar 2010
Адрес: Электросталь
Сообщений: 38
|
http://flasher.ru/forum/showpost.php...8&postcount=14 вот тут есть способ
|
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Я видел этот сообщение. Оно же самое есть, вроде, в блоге _etc. То, на что вы дали ссылку, мало чем отличается от того, что написал я. Только я привел примеры, где это копирование перестает работать. Обратите Внимание, что в примере, приведенном вами, клонируются объекты, которые по сути являются ассоциативными массивами и их дочерние элементы такие же простые структуры. Как я показал ранее, этот способ не работает над более сложными объектами, если я, конечно, где-то жестоко не на
Кстати, там в конце есть даже приписка, что данный метод хорошо подходит для чистых DTO/VO объектов - т.е., если я правильно понял, объектов, использующих описательную структуру вроде простых Object (ассоциативных массивов иже с ними {i: 1, j: 5}) и массивов.
__________________
скриптограф Последний раз редактировалось orcpochta; 20.03.2010 в 11:21. |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|