2010-06-22 5 views
8

Я пытаюсь внести изменения в массив для определенной цели. Когда у меня есть следующее:Расширение массива в ActionScript 3 (Flex)

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

Почему я не могу это сделать?

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

несмотря на то, что я могу сделать это

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

ошибка я получаю это:

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 говорит 'Вы можете расширить класс Array и переопределить или добавить методы. Однако вы должны указать подкласс как динамический или вы потеряете возможность хранения данных в массиве. – Amarghosh

ответ

13

Вместо расширения массива вы можете написать свой собственный класс, который предоставляет все методы массива. Используя класс Proxy вы можете переадресовать все методы массива по умолчанию для внутреннего массива, но по-прежнему имеют возможность добавлять свои собственные методы:

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

    } 
} 

пример:

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. Я просто добавлю ссылку на пример документа, который показывает эту технику: http://livedocs.adobe.com/flex/2/langref/flash/utils/Proxy.html # includeExamplesSummary –

+0

Хороший чистый пример Quasimondo :) – bigp

3

[] только создает массив. Он не может использоваться для создания подкласса Array.

Хороший способ «расширить» массив с новой функциональностью - написать автономные функции утилиты, которые управляют регулярными массивами. Лучше всего, это позволит вам делать что-либо в любом массиве и не ограничиваться только массивами, созданными с использованием вашего подкласса.

Вот простой пример класса, который содержит вспомогательные функции для массивов:

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

Использование:

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

Да, я знал, что смогу это сделать. Я стремился к синтаксическому сахару больше всего. –

+0

Это не поможет, если вы хотите добавить переменные и свойства в массивы. – n4pgamer

+0

Как человек, который не добавляет переменные и свойства в массивы, это функция, а не ошибка. ;) – joshtynjala

1

[1,2,3] является сокращением (или синтаксический сахар) для new Array(1,2,3). Имея это в виду, кажется более очевидным, почему ваш код выходит из строя.

Каждый TileArray является Array, поскольку TileArray расширяет Array, но обратное неверно: не каждый Array является TileArray. Таким образом, вы не можете передать Array, где ожидается TileArray. Вот почему вы получаете ошибку компилятора.

Кастинг будет откладывать ошибку только от времени компиляции до времени выполнения, так как фактический тип вашего объекта равен Array, что действительно не связано с TileArray.

Если вы хотите расширить функциональность Array (а также сможете добавить синтаксический сахар), вы можете изучить расширение Proxy, как уже было предложено. Имейте в виду, что он менее эффективен, поэтому, если вы планируете использовать этот класс в большой степени, это может быть не лучшая идея.

Смежные вопросы