Форум 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=164125)

Universe 14.08.2011 00:49

Скопировать объект без ссылки
 
У меня такая проблема:
У меня есть объект который я создаю в классе Main, затем передаю его как параметр в класс Settings. В классе Settings меняю содержимое принятого класса, и диспатчу событие при нажатии на кнопке ОК в классе Settings о том, что значения изменились. По диспатчу в классе Main я перезаписываю изначальный объект переданным, но проблема в том, что он перезаписывается ещё до диспатча, в связи с тем, как я понимаю, что переданный объект это всего лишь ссылка на начальный, соответственно меняя второй мы автоматом меняем первый! Как сделать так чтобы при передаче я создавал отдельный объект никак не связанный с изначальным т.е. надо создать реально новый объект на основании старого! Надеюсь понятно объяснил!:)

3p.station 14.08.2011 01:09

Да, это всего лишь ссылка на ваш объект созданный в Main. "Перезаписыватся" тока стринги и числа, даже xml и тот Object :)
Есть несолкько вариантов. Первый сделать метод clone у вашого объекта который будет возвращать созданный такойже объект и которому будет передано состояние клонируемого. И второй который я знаю это паттерн прототип

Universe 14.08.2011 01:57

Цитата:

И второй который я знаю это паттерн прототип
не ругайтесь непонятными словами!:)
Можно поподробнее про эти методы?)
Как например может выглядеть метод clone?

3p.station 14.08.2011 02:07

самое простое
Код AS3:

package guiComponents.graphics
{
 
        public class PaneStyle
        {
                public var topColor:uint = 0xC0C0C0;
                public var bottomColor:uint = 0xCCCCCC;
                public var borderWidth:uint = 0;
                public var borderColor:uint = 0xBBBBBB;
                public var leftTopCorner:uint = 0;
                public var rightTopCorner:uint = 0;
                public var leftBottomCorner:uint = 0;
                public var rightBotomCorner:uint = 0;
                public var gradientAngle:uint = 90;
                public var hideBottomBorder:Boolean = false;
 
                public function clone():PaneStyle
                {
                        var panestyle:PaneStyle = new PaneStyle();
                        panestyle.topColor = topColor;
                        panestyle.bottomColor = bottomColor;
                        panestyle.borderWidth = borderWidth;
                        panestyle.borderColor = borderColor;
                        panestyle.leftTopCorner = leftTopCorner;
                        panestyle.rightTopCorner = rightTopCorner;
                        panestyle.leftBottomCorner = leftBottomCorner;
                        panestyle.rightBotomCorner = rightBotomCorner;
                        panestyle.gradientAngle = gradientAngle;
                        panestyle.hideBottomBorder = hideBottomBorder;
 
                        return panestyle;
                }
 
        }//end class
}//end package

Добавлено через 2 минуты
у Rectangle есть clone() например
http://etcs.ru/as3_tips_and_tricks/d...ith_bytearray/

Universe 14.08.2011 02:12

ну это понятно, а чтото поизящнее? Интуиция подсказывает что тут должен быть какой то хитрый for in :quiet:

Добавлено через 5 минут
Не силён я в ByteArray)) Пока что не могу въехать каким это магическим образом он может скопировать весь объект))
Код AS3:

import flash.utils.ByteArray;
 
function clone(source:Object):* {
    var copier:ByteArray = new ByteArray();
    copier.writeObject(source);
    copier.position = 0;
    return(copier.readObject());
}


3p.station 14.08.2011 02:20

ну writeObject , не ?

Добавлено через 2 минуты
Код AS3:

if (referenceTextField)
                        {
                                var description:XML = describeType(referenceTextField);
 
                                for each (var item:XML in description.accessor)
                                {
                                        // clone passed textfield properties that are not readonly
                                        if (item.@access != "readonly") this[item.@name] = referenceTextField[item.@name];
                                }
                        }

так ?

mikhailk 14.08.2011 12:12

Цитата:

У меня есть объект который я создаю в классе Main,
Что мешает создать его еще раз в классе Settings и вернуть в Main?

Universe 15.08.2011 10:44

Цитата:

Что мешает создать его еще раз в классе Settings и вернуть в Main?
да, в принципе тоже хороший вариант)

Цитата:

var description:XML = describeType(referenceTextField);

for each (var item:XML in description.accessor)
{
// clone passed textfield properties that are not readonly
if (item.@access != "readonly") this[item.@name] = referenceTextField[item.@name];
}
Это пример для копирования только свойств TextField или вообще можно использовать с любыми объектами?

3p.station 15.08.2011 20:04

ну вроде для всех :)


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

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