在AS3中扩展Array类

时间:2014-01-11 17:38:10

标签: arrays actionscript-3 inheritance extend

我最近一直在学习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.

......令我极为沮丧:(。

我显然做错了什么但是因为我的爱似乎无法找出它是什么。真的需要帮助。感谢。

3 个答案:

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