2013-10-03 1 views
1

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

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

  • 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 ? 

ответ

1

Вы можете создать свой класс, расширяющий 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 
0

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

public class Test { 

     private var arr:Array = []; 

     public function Test() { 
     } 

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

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

+0

Ваш класс Test будет какой-то запасной вариант план. – n4pgamer

1

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