Форум 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.
Создать новую тему   Часовой пояс GMT +4, время: 12:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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