休息参数问题

时间:2015-04-19 14:33:09

标签: arrays actionscript-3 flash parameters

我试图让一个类继承父类的rest参数。遗憾的是,由于某种原因,继承的rest参数的输入被视为一个完整的索引而不是每个索引都像它自己的索引一样。

这里是父类的代码,其中rest参数可以正常工作:

package {
    import flash.events.MouseEvent;
    import flash.display.Stage;

public class SubClassText extends ClassText {
    protected var parentText:ClassText;
    protected var setStatValues;
    protected var className:String;
    protected var classType:int;

    public function SubClassText(textKey:String, textName:String, stageInstance:Stage, isVisible:Boolean, alignToObject:Object, direction:String, xDistance:Number, yDistance:Number, onOverText:String, parentText:ClassText, className:String, classType:int, ... setStatValues) {
        super(textKey, textName, stageInstance, isVisible, alignToObject, direction, xDistance, yDistance, onOverText);
        this.parentText = parentText;
        this.parentText.subClassArray.push(this);
        this.setStatValues = setStatValues;
        this.className = className;
        this.classType = classType;
    }

    //Called when the player clicks this object
    override protected function onClick(e:MouseEvent) {
        trace(this.setStatValues.length);
        Entity.getEntity("entityName", "player").setStat("className", this.className);
        Entity.getEntity("entityName", "player").setStat("classType", this.classType);

        for(var i:int = 0; i < this.setStatValues.length; i++) {
            Entity.getEntity("entityName", "player").setStat(Main.statArray[i], this.setStatValues[i]);
        }
        Main.setClassVisibility(this.parentText.subClassArray, true);
    }

    //Adds this object to it's parent's class array
    override protected function addToArray() {
        Main.subClasses.push(this);
    }
}
}

我在onClick侦听器中调用trace()来查看rest参数的长度。在此类的所有实例中,rest参数返回适当的输入量(在这种情况下,5表示实体拥有的统计数据)。

这是扩展此父类的类:

package {
import flash.events.MouseEvent;
import flash.display.Stage;

public class AllySubClassText extends SubClassText {
    private var displayName:String;

    public function AllySubClassText(textKey:String, textName:String, stageInstance:Stage, isVisible:Boolean, alignToObject:Object, direction:String, xDistance:Number, yDistance:Number, onOverText:String, parentText:ClassText, displayName:String, className:String, classType:int, ... setStatValues) {
        super(textKey, textName, stageInstance, isVisible, alignToObject, direction, xDistance, yDistance, onOverText, parentText, className, classType, setStatValues);
        this.displayName = displayName;
    }

    //Called when the player clicks this object
    override protected function onClick(e:MouseEvent) {
        trace(this.setStatValues.length);
        Main.tryAddAlly(this.displayName, this.className, this.classType, this.setStatValues);
        Main.setAllyVisibility(this.parentText.subClassArray, true);
    }

    //Adds this object to it's parent's class array
    override protected function addToArray() {
        Main.allySubClasses.push(this);
    }
}
}

如您所见,我有相同的休息参数和相同的trace()电话。

为了更好地理解这里是SubClassText实例的一个示例:

var beserker:SubClassText = new SubClassText("beserker", "Beserker", stage, false,
warrior, "downCenter", 0, 0, "Beserkers are crazy strong fighters", warrior, "Beserker", 
0, 15, 5, 10, 10, 10);

然后我可以进入SubClassText并跟踪其休息参数长度(setStatValues,我将从fla文档中跟踪它,所以现在我要创建该参数public而不是protected):

trace(beserker.setStatValues.length); //5

现在这里是AllySubClassText实例的一个例子:

var knight:AllySubClassText = new AllySubClassText("knight", "War: The Knight", 
stage, false, warriors, "downCenter", 0, 0, "War is a strong Knight", warriors, "War",
"Knight", 0, 15, 5, 10, 10, 10);

然后当我追踪骑士实例的休息参数长度时:

trace(knight.setStatValues.length); //1

示例部分直接从我的代码中获取,我只是缩短了onHover字符串,因此它更容易阅读。抱歉,对于类的大量输入,UI代码很快就占用了大量参数才能正常工作。我不确定为什么所有输入都被视为一个索引而不是单个索引。我甚至知道这样做是因为我在跟踪其余参数时会发生什么:

trace(knight.setStatValues + ", " + knight.setStatValues.length); //15,5,10,10,10, 1

非常感谢任何帮助。这可能是一个小小的疏忽,但我现在很难过。

1 个答案:

答案 0 :(得分:1)

问题是...rest参数是一个数组。 这意味着当您将该数组作为...rest参数传递给另一个函数时,它的长度为1,因为您只传递了一个参数:单个数组。

它不会自动将数组“解包”到其元素中。

试试这个:

function first(...firstRest):void
{
    trace(firstRest.length);
    second(firstRest);
}

function second(...secondRest):void
{
    trace(secondRest.length);
}

first(1,2,3);

我建议不要使用...rest。 创建一个包含所有状态变量的类,并将该类的对象传递给构造函数。这允许您对值进行边界检查,调度更改事件以更新显示统计信息的视图等。

你在那里显示的这些构造函数调用看起来很臃肿。 传递配置对象有助于减少混乱。