Расширьте класс Array в AS3

Недавно я изучал ООП и решил перенести этот сдвиг парадигмы в него (его нелегко... на ВСЕ), и, пробуя некоторые из его концепций, у меня возникла небольшая проблема, унаследованная от класса Array. в ActionScript 3.0 (не то, что я пытался в AS 2.0)... вздох. В любом случае, я пытаюсь вызвать родительский конструктор для создания экземпляров... rest аргументов из дочернего класса, вот так

public class CustomArray extends Array{

    public function CustomArray(...rest):void {
        super(rest);
    }
}

И я продолжаю получать эту ошибку из вывода...

ReferenceError: Error #1056: Cannot create property 0 on classes.CustomArray.

... к моему полному ужасу:(.

Я, очевидно, делаю что-то не так, но ради любви ко мне не могу понять, что это такое. Действительно нуждается в помощи. Благодарю.

3 ответа

Решение

К сожалению, в AS3 вы не можете позвонить super конструктор и передать ему параметры в Function::apply стиль, так что в вашем Array массив реализации с length=1 и один элемент (пропущенный rest Параметр с типом Array) будет создан всегда. Если вы хотите реализовать AS3 по умолчанию Array поведение конструктора:

Array Constructor
public function Array(... values)

Parameters
    ... values — A comma-separated list of one or more arbitrary values.

Note: If only a single numeric parameter is passed to the Array constructor, 
it is assumed to specify the array's length property.

Вы должны добавить код в конструктор вашего CustomArray:

public dynamic class CustomArray extends Array
{
    public function CustomArray(...rest)
    {
        super();

        var i:int, len:int;
        if(rest.length == 1)
        {
            len = rest[0];
            for (i = 0; i < len; i++) 
                this[i] = "";
        }
        else
        {
            len = rest.length;
            for (i = 0; i < len; i++) 
                this[i] = rest[i];
        }
    }
}

Также не забудьте сделать этот класс dynamic,

Объявите этот класс как динамический. Также конструктор является методом, который не указывает тип возвращаемого значения, удалить :void из его декларации.

Извините, что оживил эту "старую" ветку. Я был вынужден улучшить конструктор, предложенный fsbmain.

Когда вызывается new Array("foo"), создается объект Array, содержащий строку "foo" - ["foo"]. Поэтому я думаю, что пользовательский конструктор должен учитывать эту возможность (только один параметр, который не является числом).

Вот код, который я предлагаю:

package {
    public dynamic class MyArray extends Array {
        public function MyArray(...rest) {

        //  super(); 

        // I think super() is not mandatory here since 
        // we are basically replacing the constructor...

            var i: int, len: int;
            if (rest.length == 1) {
                if(rest[0] is Number){  
                    len = rest[0];
                    for (i = 0; i < len; i++) {
                        this[i] = null; // empty values must be null, not ""
                    }
                }else{
                    this[0]=rest[0];
                }
            } else {
                len = rest.length;
                for (i = 0; i < len; i++) {
                    this[i] = rest[i];
                }
            }
        }
    }
}
Другие вопросы по тегам