AS-3 - Как переопределить синтаксис массива / скобок → []?

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

Самая интересная часть что-то вроде:

  • array[2] = object;
  • array.hello = "world";

Вот где я застрял:

public dynamic class Array2 extends Array
{
}

var array: Array2 = new Array2();
array[2] = "hello world"; // need to do some verification before adding


Это так называемый скобочный синтаксис, который я хочу использовать. Если бы я мог использовать этот синтаксис, я мог бы использовать массив внутри, чтобы добавить к нему действительные объекты. Это больше похоже на ощущение использования массива, поэтому я могу просто заменить использованные массивы объектами моего класса.

var obj: MyClass = new MyClass();
obj[2] = "test";


Событие, когда назначается новый объект, мне тоже поможет.

var arr: Array = [];
arr[2] = "test"; // fire event with index and object ?

3 ответа

Решение

Вы можете создать свой класс, который расширяет flash.utils.Proxy

Вот образец

import flash.utils.Proxy;
import flash.utils.flash_proxy;

public dynamic class MyArray extends Proxy {

    private var acturalArray:Array;

    public function MyArray() {
        super();

        acturalArray = [];            
    }

    override flash_proxy function setProperty(name:*, value:*):void {

        //do some verification before set value,
        if (acturalArray[name] != undefined) {
            return;
        }

        acturalArray[name] = value;
    }

    override flash_proxy function getProperty(name:*):* {
        return acturalArray[name];
    }
}

А вот как это использовать

var p:MyArray = new MyArray();
p[1] = 5;
p[1] = 2;

var d:int = p[1];//d will be equal to 5

Я думаю, что вам нужен прокси- класс. Я собирался написать небольшой кусочек кода прямо здесь, но потом увидел, что на странице документации уже есть несколько хороших примеров, демонстрирующих использование.

Зачем вам нужно подкласс? Обязательно ли использовать синтаксис [] или сделать его динамическим классом? Вы можете легко сделать что-то вроде этого:

public class Test {

        private var arr:Array = [];

        public function Test() {
        }

        public function add(o:*):void {
            arr.push(o);
            //dispatch event
        }
    }
}

Изменить (после просмотра вашего): Ну, в этом случае вам в основном нужно объявить свой класс динамическим. Я не совсем уверен, как проверить в этом случае, что свойство было добавлено без некоторого таймера /enterframe.

Другие вопросы по тегам