在AS3中的类实例之间切换?

时间:2013-10-19 02:20:40

标签: actionscript-3 class multiple-instances

假设我们有4个SimpleButton类实例。 SimpleButton类具有变量b:Boolean。当您单击按钮实例时,其变量b:Boolean变为true,其余所有按钮的b:Boolean变量均为false。怎么实现呢?任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

每次实例都是创建者时,其构造函数会将自身“注册”到类静态数组中。通过将实例推入此静态数组变量,该变量随后会跟踪创建的所有实例。实例将具有变量b的公共setter函数。如果传入的布尔值为true,则将其private b属性设置为true,然后遍历在静态数组中注册的所有其他实例,并将其b setter函数设置为false。如果传入的b布尔值为false,则它只将其b设置为false,并可能更改其显示(无论您想要什么)。这将达到你想要的效果,这样每当你将实例的b setter函数设置为true时,它会自动将所有其他函数更改为false。你可以调整它来做不同的事情。例如:最多有2个实例可以使b值为true。在你的情况下,只需让监听器函数调用b setter函数,或者其他任何东西。

下面是我写的代码,用于显示我的解释,按照评论理解:

package{
public class SimpleButton extends Sprite { // your class

    private static var instances:Array = new Array(); // your static class-wide instance tracker
    private var x_b:Boolean; // your private var of b (I am using OOP techniques here

    public function SimpleButton() {
        instances.push(this); // "register" this instance into the array
    }
    // ... (rest of class)
    public function set b(newB:Boolean):void { // setter function for b
        this.x_b = newB; //set its value
        if (this.x_b) { // if its true
            for (var i in instances) { //loop through all the other "registerd" instances
                if(instances[i]!=this){ //if its not this instance
                    SimpleButton(instances[i]).b = false; // then set its b value to false
                }
            }
        }else { // if its being set to false (either manualy from outside, or from the loop of another instance
            // If you want to do something when it is false
        }
    }
    public function get b():Boolean { //just a getter to match our setter
        return this.x_b;
    }
}
}

如果我已回答你的问题,那就太棒了!但如果没有,那么请回复并告诉我。感谢。

修改

SimpleButton的所有实例只有一个数组。这对班级来说是静态的。它不是对占用内存的实例的引用,而是实例本身。我的意思是如果你创建了50个SimpleButtons实例,那么它们就是50个不同的对象来跟踪它们。即使您创建了1000个指向同一实例的变量,对于计算机而言,这些变量只是对实例的引用,而不是实例本身,因此您在内存中仍然只有50个对象。这里也是如此。该数组只是一个数组,其中包含对各种SimpleButton的大量引用。如果删除对类实例的所有引用,该实例仍然是它们在计算机中 - 您再也无法访问它,只有在Flash播放器的“垃圾收集”运行时才会删除它,并删除所有对象没有引用它们。这个“集合”是在flash播放器中删除东西的唯一方法,使变量等于null不会删除它,它只删除对它的引用。当从类外部处理SimpleButtons时,这种方式非常优雅和容易。您所做的就是创建一个并自动记录自己 - 准备好在另一个更改时更改其b var。

如果你仍然无法理解对象的引用和内存中的对象之间的差异,那么再次回复,我会找到一个很好的链接来发送给你。