07 ноября 2012

Расширение Array в actionscript

Не так давно возникла проблема расширения класс Array для включения ряда своих дополнений. Я написал расширения. И решил поделиться с Вами. Есть несколько нюансов, например наследование будет не от Array, а от Proxy (он специально создан для итого чтобы расширять Array пользователем):


// Foundation.as
package mixailflash.Foundation
{
 import flash.utils.Proxy;
 import flash.utils.flash_proxy; //без этого вообще работать не будет
 use namespace flash_proxy;
 
 dynamic public class ArrayFoundation extends Proxy
 {
  
  private var _array:Array;
  
  public function ArrayFoundation(...parameters)
  {
    _array = parameters;
  }
  
  public function remove(value:*):void
  {
   for (var i:int = _array.length-1; i >=0; i --)
   {
    if (_array[i] == value) _array.splice(i, 1);
   }
  }
  
  public function isKey(value:*):Boolean
  {
   if (_array[value]) return true;
   return false;
  }
  
  public function get lenght():int
  {
   return _array.length;
  }
  
  override flash_proxy function callProperty( name:*, ...rest):* 
  {
   return _array[name].apply(_array, rest);
   
  }
  
  override flash_proxy function getProperty(name:*):* 
  {
   return _array[name];
  }
  
  override flash_proxy function setProperty(name:*, value:*):void 
  {
   _array[name] = value;
  }
 }
}


Так же необходимо обратить внимание как его использовать, при необходимости можно переопределить все методы и свойства Array в ArrayFoundation:

// Core.as
package
{
 import mixailflash.Foundation.*;
 import avmplus.USE_ITRAITS; // без этого работать не будет
 import flash.display.Sprite;
 
 public class Core extends Sprite
 {
  public function Core()
  {
   var test:ArrayFoundation = new ArrayFoundation();
   test.push(1);
   test.push(1);
   test.push(1);
   test.push(2);
   trace (test.isKey(1)); // true; 1- это номер элемента
   trace(test); // 1, 1, 1, 2
   test.remove(1);  // удаляем элементы равные 1;
   trace (test.isKey(1)); // false; 
   trace(test); //2
  }
 }
}


Буду рад если кому-нибудь пригодится!