Расширьте класс 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];
}
}
}
}
}