我最近一直在学习OOP,并决定将这种范式转移到它(它不容易......在所有)并尝试一些概念,我有一些问题继承自ActionScript 3.0中的Array类(不是我在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.
......令我极为沮丧:(。
我显然做错了什么但是因为我的爱似乎无法找出它是什么。真的需要帮助。感谢。
答案 0 :(得分:1)
将此类声明为动态。构造函数也是一种不指定返回类型的方法,从其声明中删除:void
。
答案 1 :(得分:1)
不幸的是,在AS3中,您无法调用super
构造函数并以Function::apply
样式向其传递参数,因此在Array
实现数组中包含length=1
和一个元素(将始终创建传递的rest
参数,其类型为Array)。
如果您要实施默认AS3 Array
constructor behavior:
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
。
答案 2 :(得分:1)
很抱歉重振这个“旧”主题。我觉得有必要改进fsbmain提出的构造函数。
当一个人调用new Array(“foo”)时,会创建一个包含字符串“foo” - [“foo”]的Array对象。所以我认为自定义构造函数必须考虑到这种可能性(只有一个不是数字的参数)。
这是我建议的代码:
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];
}
}
}
}
}