2017-06-15 4 views
1

Ich möchte auf viele Klassen und Variablen zugreifen, ich möchte dies tun, indem Sie den Klassennamen und den Variablennamen dynamisch festlegen. Derzeit bin ichActionscript, kann auf eine Klasse mit einem Variablennamen zugegriffen werden?

mit
MyClass["myVariable1"] 

dynamisch den Variablennamen

Zugriff
MyClass.myVariable1 

ich auch dynanmically wollen acces den Klassennamen, so etwas wie

["MyClass"]["myVariable1"] 

Aber das funktioniert nicht.

Der Zweck ist, dass ich Objekt mit vielen Benutzereinstellungen geteilt habe, ich möchte durch das gemeinsame Objekt iterieren und alle Benutzereinstellungen über alle Klassen setzen. Ich denke, wenn ich dynamisch auf die Klasse zugreifen kann, muss ich eine Anweisung für jeden Klassennamen/Variable haben.

+0

Sie werden wahrscheinlich immer noch eine Instanz einer Klasse benötigen. Es ist jedoch grundlegend, Klasse nach Namen zu bekommen, und das wird in dieser Antwort erklärt. – Vesper

Antwort

3

ich gegen eine solche Praxis zu beraten. Obwohl technisch möglich, ist es wie eine Katastrophe in die App-Architektur begrüßen:

  1. Sie verlassen sich auf etwas haben Sie keine offensichtliche Kontrolle: auf dem Weg Flash-Namen die Klassen.

  2. Sie gehen aus der zukünftigen Möglichkeit, Ihren Code mit Bezeichner Umbenennung Verschleierung zu schützen, weil es Ihren Code ungültig machen wird.

  3. Kompilierzeit Fehlerprüfungen ist besser als Laufzeit, und Sie verlassen es zur Laufzeit. Wenn es in einer Umgebung ohne Debugging fehlschlägt, werden Sie es nie erfahren.

  4. Der nächste Entwickler, der mit Ihrem Code arbeitet (möglicherweise in ein paar Jahren), wird schwer herausfinden können, woher die ursprünglichen Daten kommen.

Also, alle oben mit, ermutige ich Sie zu einem anderen Modell wechseln:

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

In der Hauptklasse rufen Sie

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. 

Dann wird jede Klasse, die auf dieser Feeds Daten sollten einen Initialisierungsblock haben:

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

Nun, schon wieder.Der obige Code:

  • verwendet keine seltsam Praktiken und einfach
  • in jeder Klasse jedermann verstehen kann deutlich sehen, wo die Daten kommen aus
  • wird für Fehler bei der Kompilierung
  • geprüft werden kann verschleiert und geschützt werden
2

können Sie versuchen, die Klasse in eine Variable bekommen und gehen von dort aus:

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