我建议不要这样的做法。虽然技术上是可行的,它像欢迎一个灾难到应用程序的体系结构:
你依赖的东西,你有没有明显的控制:在途中闪光的名字的类。
你走出了未来的可能性,以标识符重命名混淆来保护你的代码,因为它会使你的代码无效。
编译时错误检查比运行时好,并且您将其保留到运行时。如果它在非调试环境中发生故障,你永远不会知道。
下一个使用您的代码的开发人员(可能在几年后)将很难找到最初的数据来自哪里。
所以,具有所有上述,我建议您切换到另一种模式:
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;
}
}
}
在主类中调用
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.
然后每个这些是饲料类数据应该有一个初始化块:
// 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);
}
呃,再次。上面的代码:
- 没有采用怪异做法,很容易理解
- 每个班每个人都可以清楚地看到数据来自
- 在编译时
- 将被检查是否存在错误可以被混淆和保护
您仍然可能需要一个类的实例。然而,按名称获得类是什么是根本,并在这个答案中解释。 – Vesper