2010-06-22 21 views
8

Estoy intentando hacer una variación en Array para un propósito muy específico. Cuando tengo lo siguiente:Ampliación de matriz en Actionscript 3 (Flex)

public class TileArray extends Array { 
    // Intentionally empty - I get the error regardless 
} 

¿Por qué no puedo hacer esto?

var tl:TileArray = [1,2,3]; 

a pesar del hecho de que puedo hacer esto

var ar:Array = [1,2,3]; 

El error que recibo es la siguiente:

Implicit coercion of a value with static type Array to a possibly unrelated type

+5

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Array.html dice 'Puede extender la clase Array y anular o agregar métodos. Sin embargo, debe especificar la subclase como dinámica o perderá la capacidad de almacenar datos en una matriz. – Amarghosh

Respuesta

13

En lugar de extender la matriz se podría escribir su propia clase que expone todos los métodos de Array. Mediante el empleo de la clase Proxy puede redirigir todos los métodos de matriz por defecto a una matriz interna, pero todavía tienen la flexibilidad para añadir sus propios métodos:

package 
{ 
    import flash.utils.flash_proxy; 
    import flash.utils.Proxy; 

    use namespace flash_proxy; 

    dynamic public class ExampleArray extends Proxy 
    { 
     private var _array:Array; 

     public function ExampleArray(...parameters) 
     { 
      _array = parameters; 
     } 

     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; 
     } 

     public function getSmallestElement():* 
     { 
      var helper:Array = _array.concat().sort(); 
      return helper[0]; 
     } 

    } 
} 

ejemplo:

var test:ExampleArray = new ExampleArray(8,7,6,5,4,3,2,1); 
trace(test.getSmallestElement()); // 1 
test.sort(); 
trace(test); // 1,2,3,4,5,6,7,8 
+0

+1. Solo agregaría un enlace al ejemplo del documento, que muestra esta técnica: http://livedocs.adobe.com/flex/2/langref/flash/utils/Proxy.html # includeExamplesSummary –

+0

Nice clean example Quasimondo :) – bigp

3

[] sólo se crea una matriz. No se puede usar para crear una subclase de Array.

La buena manera de "extender" Array con nuevas funcionalidades es escribir funciones de utilidad independientes que manipulen Arrays comunes. Lo mejor de todo es que esto le permitirá hacer cualquier cosa a cualquier matriz y no limitarse solo a las matrices creadas con su subclase.

Aquí está un ejemplo sencillo de una clase que contiene funciones de utilidad para Arrays:

package com.example.utils 
{ 
    public class ArrayUtil 
    { 
     public static function traceArray(array:Array):void 
     { 
      trace(array.length, "[" + array + "]"); 
     } 
    } 
} 

Uso:

ArrayUtil.traceArray([1, 2, 3]); //output: 3 [1,2,3] 
+0

Sí, sabía que podía hacer esto. Estaba apuntando al azúcar sintáctico más que a cualquier otra cosa. –

+0

Esto no ayuda si desea agregar variables y propiedades a las matrices. – n4pgamer

+0

Como alguien que no agrega variables y propiedades a las matrices, esa es una característica, no un error. ;) – joshtynjala

1

[1,2,3] es la abreviatura (o azúcar sintáctico) para new Array(1,2,3). Con eso en mente, parece más evidente por qué su código falla.

Cada TileArray es un Array, ya que se extiende TileArrayArray, pero la inversa no es cierto: no todos los Array es una TileArray. Por lo tanto, no puede pasar Array donde se espera TileArray. Es por eso que obtienes el error del compilador.

Casting solo diferirá el error del tiempo de compilación al tiempo de ejecución, ya que el tipo real de su objeto es Array, que de hecho no está relacionado con TileArray.

Si desea ampliar la funcionalidad Array (y también ser capaz de añadir un poco de azúcar sintáctica), es posible que desee ver en extender Proxy, como ya se sugirió. Tenga en cuenta que es menos eficiente, por lo que si planea utilizar esta clase en gran medida, esta podría no ser la mejor idea.

Cuestiones relacionadas