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;
我反对这种做法。虽然在技术上是可行的,但它就像是在应用程序架构中迎来了一场灾难:
你依赖于你无法明显控制的东西:Flash 命名 classes 的方式。
您以后不可能使用标识符重命名混淆来保护您的代码,因为它会使您的代码无效。
编译时的错误检查比运行时的好,你把它留给了运行时。如果恰好在非调试环境下失败,你永远不会知道。
下一位使用您的代码的开发人员(可能是几年后的您)将很难找到初始数据的来源。
所以,综上所述,我鼓励您切换到另一个模型:
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 中任何人都可以清楚地看到数据的来源
- 将在编译时检查错误
- 可以混淆和保护
我想访问许多 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;
我反对这种做法。虽然在技术上是可行的,但它就像是在应用程序架构中迎来了一场灾难:
你依赖于你无法明显控制的东西:Flash 命名 classes 的方式。
您以后不可能使用标识符重命名混淆来保护您的代码,因为它会使您的代码无效。
编译时的错误检查比运行时的好,你把它留给了运行时。如果恰好在非调试环境下失败,你永远不会知道。
下一位使用您的代码的开发人员(可能是几年后的您)将很难找到初始数据的来源。
所以,综上所述,我鼓励您切换到另一个模型:
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 中任何人都可以清楚地看到数据的来源
- 将在编译时检查错误
- 可以混淆和保护