Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.03.2010, 19:17
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 1  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
По умолчанию Клонирование объектов

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

Вот, вроде, можно написать такую функцию, для клонирования примитивных объектов (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, как можно было бы ожидать при использовании дефолтных значений параметров конструктора.

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


Последний раз редактировалось orcpochta; 20.03.2010 в 02:24.
Старый 19.03.2010, 20:39
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 2  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
я недостаточно компетентен, чтобы рассказывать почему не получается и почему вызывается конструктор, но гарантированно вам скажу, что у вас ничего не получится с клонироваением таким образом.

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

Старый 19.03.2010, 20:41
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 3  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Цитата:
Сообщение от iflamberg Посмотреть сообщение
я недостаточно компетентен, чтобы рассказывать почему не получается и почему вызывается конструктор, но гарантированно вам скажу, что у вас ничего не получится с клонироваением таким образом.

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

Старый 19.03.2010, 21:01
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 4  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
что серьёзно? именно так и называется? ну те на, а я и не знал =)
__________________
мой пустой блог

Старый 20.03.2010, 10:55
NBVestal вне форума Посмотреть профиль Отправить личное сообщение для NBVestal Найти все сообщения от NBVestal
  № 5  
Ответить с цитированием
NBVestal
 
Аватар для NBVestal

Регистрация: Mar 2010
Адрес: Электросталь
Сообщений: 38
http://flasher.ru/forum/showpost.php...8&postcount=14 вот тут есть способ

Старый 20.03.2010, 11:16
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 6  
Ответить с цитированием
orcpochta

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

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


Последний раз редактировалось orcpochta; 20.03.2010 в 11:21.
Создать новую тему Ответ Часовой пояс GMT +4, время: 16:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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