2017-06-15 69 views
1

我想访问许多类和变量,我想通过动态设置类名和变量名来实现。目前我使用Actionscript,可以使用变量名称访问一个类?

MyClass["myVariable1"] 

动态访问变量名

MyClass.myVariable1 

我也想dynanmically存取权限类名,像

["MyClass"]["myVariable1"] 

但是,这是行不通的。

目的是我有许多用户设置的共享对象,我想迭代通过共享对象,并设置所有类的所有用户设置。我认为如果我不能动态访问类,我必须为每个类名/变量都声明一个语句。

+0

您仍然可能需要一个类的实例。然而,按名称获得类是什么是根本,并在这个答案中解释。 – Vesper

回答

3

我建议不要这样的做法。虽然技术上是可行的,它像欢迎一个灾难到应用程序的体系结构:

  1. 你依赖的东西,你有没有明显的控制:在途中闪光的名字的类。

  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; 
     } 
    } 
} 

在主类中调用

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); 
} 

呃,再次。上面的代码:

  • 没有采用怪异做法,很容易理解
  • 每个班每个人都可以清楚地看到数据来自
  • 在编译时
  • 将被检查是否存在错误可以被混淆和保护
2

你可以试着让全班学生分成一个变量,并从那里:

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