如何在应用程序中的所有类之间共享数组?

Kat*_*ore 2 arrays share get class actionscript-3

我想共享一个数组,所有类都可以"获取"并"更改"该数组中的数据.类似全局数组或多重访问数组的东西.如何使用ActionScript 3.0实现这一目标?

ric*_*son 6

有几种方法可以解决这个问题.一种是使用全局变量(如unkiwii的回答中所述),但这在ActionScript中并不是一种非常常见的方法.更常见的方法是:

类变量(静态变量)

创建一个名为DataModel或类似的类,并将该类的数组变量定义为static:

public class DataModel {
    public static var myArray : Array = [];
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用应用程序中的任何部分访问它DataModel.myArray.这很少是一个很好的解决方案,因为(就像全局变量一样)应用程序的某个部分无法知道应用程序的另一部分何时修改了数组的内容.这意味着即使您的数据输入GUI将一个对象添加到数组,您的数据列表GUI也不会知道显示新数据,除非您实现了一些告诉它重绘的方法.

单身包装数组

另一种方法是创建一个名为ArraySingleton的类,它包装实际的数组并为其提供访问方法,并且可以使用将单个实例保存在静态变量中的非常常见的单例模式来访问其实例.

public class ArraySingleton {
    private var _array : Array;

    private static var _instance : ArraySingleton;


    public static function get INSTANCE() : ArraySingleton {
        if (!_instance)
            _instance = new ArraySingleton();

        return _instance;
    }


    public function ArraySingleton() {
        _array = [];
    }


    public function get length() : uint {
        return _array.length;
    }

    public function push(object : *) : void {
        _array.push(object);
    }

    public function itemAt(idx : uint) : * {
        return _array[idx];
    }
}
Run Code Online (Sandbox Code Playgroud)

此类包装数组,可以通过访问单个实例ArraySingleton.INSTANCE.这意味着您可以:

var arr : ArraySingleton = ArraySingleton.INSTANCE;
arr.push('a');
arr.push('b');
trace(arr.length); // traces '2'
trace(arr.itemAt(0)); // trace 'a'
Run Code Online (Sandbox Code Playgroud)

这样做的最大好处是,您可以在添加项目时或在以任何其他方式修改阵列时调度事件,以便可以向应用程序的所有部分通知此类更改.您可能希望通过实现更多类似于数组的接口来扩展上面的示例,例如pop(),shift(),unshift()等.

依赖注入

大规模应用程序开发中的一种常见模式称为依赖注入,基本上意味着通过以某种方式标记您的类(经常使用AS3元数据),您可以发信号通知框架应该"注入"该类的引用.这样,该类不需要关心引用的来源,但框架将确保它在那里.

一个非常流行的AS3 DI框架是Robotlegs.