Actionscript,可以使用变量名访问 class 吗?

Actionscript, can a class be accessed using a variable name?

我想访问许多 classes 和变量,我想通过动态设置 class 名称和变量名称来实现。目前我正在使用

MyClass["myVariable1"]

动态访问变量名

MyClass.myVariable1

我还想动态访问 class 名称,例如

["MyClass"]["myVariable1"]

但这不起作用。

目的是我有许多用户设置的共享对象,我想遍历共享对象并在所有 class 中设置所有用户设置。我想如果我不能动态访问 class 我必须为每个 class name/variable.

都有一个声明

您可以尝试将 class 放入变量并从那里开始:

var myClass:Class = getDefinitionByName("MyClass") as Class;
myClass["myVariable1"] = x;

我反对这种做法。虽然在技术上是可行的,但它就像是在应用程序架构中迎来了一场灾难:

  1. 你依赖于你无法明显控制的东西:Flash 命名 classes 的方式。

  2. 您以后不可能使用标识符重命名混淆来保护您的代码,因为它会使您的代码无效。

  3. 编译时的错误检查比运行时的好,你把它留给了运行时。如果恰好在非调试环境下失败,你永远不会知道。

  4. 下一位使用您的代码的开发人员(可能是几年后的您)将很难找到初始数据的来源。

所以,综上所述,我鼓励您切换到另一个模型:

package
{
    import flash.net.SharedObject;

    public class SharedData
    {
        static private var SO:SharedObject;

        static public function init():void
        {
            SO = SharedObject.getLocal("my_precious_shared_data", "/");
        }

        static public function read(key:String):*
        {
            // if (!SO) init();
            return SO.data[key];
        }

        static public function write(key:String, value:*):void
        {
            // if (!SO) init();
            SO.data[key] = value;
            SO.flush();
        }

        // Returns stored data if any, or default value otherwise.
        // A good practice of default application values that might
        // change upon user activity, e.g. sound volume or level progress.
        static public function readSafe(key:String, defaultValue:*):*
        {
            // if (!SO) init();
            return SO.data.hasOwnProperty(key)? read(key): defaultValue;
        }
    }
}

主要class你打电话

SharedData.init();
// So now your shared data are available.
// If you are not sure you can call it before other classes will read
// the shared data, just uncomment // if (!SO) init(); lines in SharedData methods.

然后每个以这些数据为食的 class 都应该有一个初始化块:

// It's a good idea to keep keys as constants
// so you won't occasionally mistype them.
// Compile time > runtime again.
static private const SOMAXMANA:String = "maxmana";
static private const SOMAXHP:String = "maxhp";

private var firstTime:Boolean = true;

private var maxmana:int;
private var maxhp:int;

// ...

if (firstTime)
{
    // Make sure it does not read them second time.
    firstTime = false;

    maxhp = SharedData.readSafe(SOMAXHP, 100);
    maxmana = SharedData.readSafe(SOMAXMANA, 50);
}

好吧,又​​来了。上面的代码:

  • 不采用奇怪的做法并且易于理解
  • 在每个 class 中任何人都可以清楚地看到数据的来源
  • 将在编译时检查错误
  • 可以混淆和保护