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.