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

HardCoder 20.12.2011 17:27

Как создать сеттер массива?
 
Здравствуйте. Сабж. Возможно ли такое. Если да, то как? Возьмем, например, двухмерный массив:
Код AS3:

var _myArray:Array = new Array();
arr[2][2].foo = 20;
private function set arr():void{
 
}

Подскажите пожалуйста, что нужно писать в сеттере arr?

illuzor 20.12.2011 17:30

Во-первых, сеттер должен быть публичным, во-вторых - получать какое-то значение

Код AS3:

public function set arr(value:Array):void{
  _myArray = value;
}


HardCoder 20.12.2011 17:37

Цитата:

Сообщение от illuzor (Сообщение 1052624)
Во-первых, сеттер должен быть публичным

С каких это пор?
Цитата:

Сообщение от illuzor (Сообщение 1052624)
во-вторых - получать какое-то значение

Это я знаю. Я не знаю как эти значения передать в сеттер (именно массива).
Не пойму, какое отношение ваш код имеет к моему вопросу.
Код AS3:

var _myArray:Array = new Array();
arr[2][2].foo = 20;
private function set arr():void{
 //Здесь нужно чтобы _myArray[2][2].foo стало 20
}


GBee 20.12.2011 17:39

Вам не сеттер нужен, а геттер. Хотя я вообще не понимаю, чего вы хотите.
Код AS3:

var _myArray:Array = [[],[],[]];
private function get arr():Array
{
    return _myArray;
}
arr[2][2].foo = 20;


DaFive 20.12.2011 17:40

Что за такой сеттер массива и что он должен делать? Ну нипаняяятна же.

Inet_PC 20.12.2011 17:41

Цитата:

private function set arr():void{

}
Вам же сказали, что здесь ошибка.
Цитата:

не пойму, какое отношение ваш код имеет к моему вопросу.
Естесственно, в эту тему два телепата из другой еще не зашли. Упс, опоздал))
Цитата:

var _myArray:Array = new Array();
arr[2][2].foo = 20;
И это тоже работать не будет.

ChuwY 20.12.2011 17:41

Для такого обращения вам нужен не сеттер, а геттер.

Код AS3:

private function get arr():Array{
  return _myArray;
}


Опоздал.

HardCoder 20.12.2011 17:55

Цитата:

Сообщение от Inet_PC (Сообщение 1052631)
Цитата:

private function set arr():void{

}
Вам же сказали, что здесь ошибка.

Это не ошибка. Я нарочно упустил аргументы, потому что понятия не имею как их передать.
Представьте себе Класс на 1000 строк. В нем есть 2 массива _myArray1 и _myArray2. Структура массивов идентична (отличатся лишь типами содержащихся обьектов). При изменении елементов одного массива _myArray1 нужно изменить элементы с таким же индексом _myArray2. Тоесть массивы должны быть, как-бы, связаны друг с другом. Что же получается: 250 раз изменять один массив, и 250 раз изменять второй? Не проще ли создать функцию, которая при изменении одного будет изменять второй автоматически.

Добавлено через 5 минут
Хотя, да. Здесь никакой сеттер не пойдет, нужно писать функцию. Закрывайте

Inet_PC 20.12.2011 18:12

Код AS3:

private function setArrayValue(index: int, value:Object):void
{
_myArray1[index] = value;
_myArray2[index] = //делаем, что-то с этим элементом
}

Типа этого?
Я так понял Вы сначала, что-то долго делаете с первым массивом,
а потом хотите, чтобы подобные изменения отразились во втором, так? Тогда еще можно, как помечать в первом те элементы которые изменились и потом пробегаться по всем элементам и менять что-то во втором, но это будет менее производительно, чем функция выше.

HardCoder 20.12.2011 18:24

Цитата:

Сообщение от Inet_PC (Сообщение 1052640)
Я так понял Вы сначала, что-то долго делаете с первым массивом,
а потом хотите, чтобы подобные изменения отразились во втором, так?

Ну, наконец - то :).
Цитата:

Сообщение от Inet_PC (Сообщение 1052640)
Тогда еще можно, как помечать в первом те элементы которые изменились и потом пробегаться по всем элементам и менять что-то во втором, но это будет менее производительно, чем функция выше.

Да, согласен...

goodguy 20.12.2011 19:29

Цитата:

С каких это пор?
А какой смысл в приватном сеттере?

in4core 20.12.2011 19:37

Цитата:

А какой смысл в приватном сеттере?
Лично для меня как минимум в красоте описания.

Код AS3:

const megaRandomDO:MDO = new MDO ( randomVar )
private function get randomVar():int { return ... }

нежели
Код AS3:

new MDO ( _randomVar() )

- ну не красиво же........
Хотя это про геттер... а сеттер тоже хз где

goodguy 20.12.2011 20:15

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

Inet_PC 20.12.2011 20:29

Цитата:

ну а приватный сеттер - это что-то бессмысленное, имхо
Но не невозможное

dimarik 20.12.2011 20:36

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

goodguy 20.12.2011 21:18

Цитата:

Но не невозможное
Я и не говорил, что это невозможно.

dimarik 20.12.2011 21:36

Приватный сеттер использовал пару раз. Необходимо было диспатчить событие изменение модели при изменении некоторого параметра, который изменялся из нескольких мест. Но наружу он не был виден (по событию читалось другое свойство)

Код AS3:

private function set param(value:Boolean):void {
    if ( this._param === value )
        return;
    this._param = value;
    super.dispatchEvent( new Event(Event.CHANGE) );
}
 
function methodOne():void {
    if (что-то)
        this.param = false;
}
 
 
function methodTwo():void {
    if (что-то)
        this.param = true;
}
 
function methodFour():void {
    if (что-то)
        this.param = false;
}


djyamato 20.12.2011 21:48

Цитата:

Сообщение от dimarik (Сообщение 1052679)
Можно воспользоваться Proxy в качестве первого массива и диспатчить изменения, которые подхватит обертка второго массива.

Присоединяюсь

Или вот как еще можно:

При смене значения элемента одного массива он диспатчит событие о изменении значения элемента, это событие отлавливается и во 2м массиве меняется значение элемента с таким же индексом

Код AS3:

package com.CustomArray
{
        import com.CustomArray.events.CustomArrayEvent;
 
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IEventDispatcher;
 
        dynamic public class CustomArray extends Array implements IEventDispatcher
        {
                private var dispatcher:EventDispatcher;
 
                public function CustomArray()
                {
                        dispatcher = new EventDispatcher(this);
                }
 
                public function add(val:*):void
                {
                        this.push(val);
                        dispatchEvent(new CustomArrayEvent(CustomArrayEvent.COLLECTION_CHANGE));
                }
                public function update(val:*,index:int):void
                {
                        this[index]=val;
                        dispatchEvent(new CustomArrayEvent(CustomArrayEvent.COLLECTION_VALUE_CHANGE,{ind:index,value:val}));
                }
 
                /*
                        iEventDispatcher Implementation
                */

                public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
                {
                        dispatcher.addEventListener(type, listener, useCapture, priority);
                }
 
                public function dispatchEvent(evt:Event):Boolean
                {
                        return dispatcher.dispatchEvent(evt);
                }
 
                public function hasEventListener(type:String):Boolean
                {
                        return dispatcher.hasEventListener(type);
                }
 
                public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
                {
                        dispatcher.removeEventListener(type, listener, useCapture);
                }
 
                public function willTrigger(type:String):Boolean
                {
                        return dispatcher.willTrigger(type);
                }
        }
}

Код AS3:

package com.CustomArray.events
{
        import flash.events.Event;
 
        public class CustomArrayEvent extends Event
        {
                public var messageData:Object;
                public static const COLLECTION_CHANGE:String="collectionChange";
                public static const COLLECTION_VALUE_CHANGE:String="collectionValueChange";
 
                public function CustomArrayEvent(type:String, data:Object=null, bubbles:Boolean=false, cancelable:Boolean=false)
                {
                        super(type, bubbles, cancelable);
                        var messObj:Object=new Object();
                        messObj.data=data;
                        this.messageData=messObj;
                }
        }
}

Использование:
Код AS3:

package
{
        import com.CustomArray.CustomArray;
        import com.CustomArray.events.CustomArrayEvent;
 
        import flash.display.Sprite;
 
        public class ArrayProxyTest extends Sprite
        {
                protected var _array1:CustomArray=new CustomArray();
                protected var _array2:CustomArray=new CustomArray();
 
                public function ArrayProxyTest()
                {
                        _array1.addEventListener(CustomArrayEvent.COLLECTION_VALUE_CHANGE,sourceArrayCollectionValueChangeHandler);
                        _array1.addEventListener(CustomArrayEvent.COLLECTION_CHANGE,sourceArrayCollectionChangeHandler);
                        _array1.add(1);
                        _array1.add(2);
                        _array1.add(3);
 
                        _array1.update(45,2);
                }
 
                protected function sourceArrayCollectionChangeHandler(event:CustomArrayEvent):void
                {
                        _array2=_array1;
                        trace("\nCollectionChange\nARRAY 1: "+_array1);
                        trace("ARRAY 2: "+_array2);
                }
 
                protected function sourceArrayCollectionValueChangeHandler(event:CustomArrayEvent):void
                {
                        _array2[event.messageData.index]=event.messageData.value; // смена значения элемента во 2м массиве
                        trace("\nCollectionValueChange\nARRAY 1: "+_array1);
                        trace("ARRAY 2: "+_array2);
                }
        }
}

трэйс:
Код:

CollectionChange
ARRAY 1: 1
ARRAY 2: 1

CollectionChange
ARRAY 1: 1,2
ARRAY 2: 1,2

CollectionChange
ARRAY 1: 1,2,3
ARRAY 2: 1,2,3

CollectionValueChange
ARRAY 1: 1,2,45
ARRAY 2: 1,2,45


Котяра 20.12.2011 21:50

ArrayList, ArrayCollection - мне кажется вам нужно что-то из этой области.
Если я правильно конечно понял.
Т.е. при изменении.удалении.добавлении не самого массива, а какого нибудь элемента массива - нужно получить событие.

HardCoder 20.12.2011 21:50

Цитата:

Сообщение от goodguy (Сообщение 1052655)
А какой смысл в приватном сеттере?

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

Inet_PC 20.12.2011 22:10

Цитата:

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

dimarik 20.12.2011 22:39

Цитата:

Сообщение от djyamato (Сообщение 1052698)
Присоединяюсь
Или вот как еще можно:

Тогда можно и push и все остальное переопределить. Зачем там add? ) И в качестве Array может выступить без переписывания кода.
Только доступ по [] будет нарушен.

djyamato 20.12.2011 23:55

Цитата:

Сообщение от dimarik (Сообщение 1052715)
Тогда можно и push и все остальное переопределить.

верно, это я к примеру написал, поспешил, не подумал

Цитата:

Сообщение от dimarik (Сообщение 1052715)
И в качестве Array может выступить без переписывания кода.

Это как ?

dimarik 21.12.2011 12:33

Код AS3:

public function methodOne(list:Array):void {
    list.push(), pop() и пр., кроме list[0], CustomArray не словит изменение ячейки прямым доступом,
но само изменение прокатит.
}
 
methodOne( new CustomArray() );



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

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