Frage

Wie kann man eine Instanz der Klasse Action Class von einer Instanz dieser Klasse bekommen?

In Python, würde dies x.__class__ werden; in Java, x.getClass();.

Ich bin mir bewusst, dass diese existieren zu tun , aber ich bin für eine eingebaute Sprach Anlage suchen, oder zumindest eine Bibliotheksroutine auf etwas gebaut zuverlässig.

War es hilfreich?

Lösung

Sie können es durch die ‚Konstruktor‘ Eigenschaft des Basisobjektklasse erhalten. das heißt:.

var myClass:Class = Object(myObj).constructor;

Andere Tipps

Jeder Grund, warum Sie dies nicht tun könnten?

var s:Sprite = new flash.display.Sprite();

var className:String = flash.utils.getQualifiedClassName( s );
var myClass:Class = flash.utils.getDefinitionByName( className ) as Class;

trace(className ); // flash.display::Sprite
trace(myClass); // [class Sprite]

var s2 = new myClass();
trace(s2); // [object Sprite]

Ich weiß nicht, einen Weg Round-Tripping durch einen String zu vermeiden, aber es sollte gut genug, um arbeiten.

Die akzeptiert (und zur Zeit populärste Antwort) hat einige Mängel. Die Antwort dient für diesen speziellen Anwendungsfall, aber die Kommentare haben die Antwort auf eine scheinbar allgemeine Lösung erweitert.

Aber es ist nicht eine typsichere Lösung in bestimmten Fällen, und es bezieht sich nicht auf alle möglichen Objekte. Die Idee, dass XML ist nicht gut genug, um hier und an anderer Stelle angesprochen unterstützt wurde, aber die typsichere Idee hat, nicht.

gemacht Die Annahme ist, dass es ein Klassenobjekt vom Programmierer erstellt. Hier sind einige der Tests, die ich einrichten (dies ist im Strict-Modus, sondern ein lokaler Test). Beachten Sie die int Testergebnisse:

var sprite:Sprite = new Sprite();
var xml:XML = new XML();
var testInt:int = 2;
var testClass:TestClass = new TestClass();
var testAnon:Object = {};

trace("classname 1 = " + getQualifiedClassName(sprite));
trace("myclass 1 = " + getDefinitionByName(getQualifiedClassName(sprite)));
trace("constructor a 1 = " + Object(sprite).constructor);
trace("constructor a 1 = " + (Object(sprite).constructor as Class));
trace("constructor b 1 = " + sprite["constructor"]);
trace("constructor b 1 = " + (sprite["constructor"] as Class));
trace("...");
trace("classname 2 = " + getQualifiedClassName(xml));
trace("myclass 2 = " + getDefinitionByName(getQualifiedClassName(xml)));
trace("constructor a 2 = " + Object(xml).constructor);
trace("constructor a 2 = " + (Object(xml).constructor as Class));
trace("constructor b 2 = " + xml["constructor"]);
trace("constructor b 2 = " + (xml["constructor"] as Class));
trace("...");
trace("classname 3 = " + getQualifiedClassName(testInt));
trace("myclass 3 = " + getDefinitionByName(getQualifiedClassName(testInt)));
trace("constructor a 3 = " + Object(testInt).constructor);
trace("constructor a 3 = " + (Object(testInt).constructor as Class));
trace("constructor b 3 = " + testInt["constructor"]);
trace("constructor b 3 = " + (testInt["constructor"] as Class));
trace("...");
trace("classname 4 = " + getQualifiedClassName(testClass));
trace("myclass 4 = " + getDefinitionByName(getQualifiedClassName(testClass)));
trace("constructor a 4 = " + Object(testClass).constructor);
trace("constructor a 4 = " + (Object(testClass).constructor as Class));
trace("constructor b 4 = " + testClass["constructor"]);
trace("constructor b 4 = " + (testClass["constructor"] as Class));
trace("...");
trace("classname 5 = " + getQualifiedClassName(testAnon));
trace("myclass 5 = " + getDefinitionByName(getQualifiedClassName(testAnon)));
trace("constructor a 5 = " + Object(testAnon).constructor);
trace("constructor a 5 = " + (Object(testAnon).constructor as Class));
trace("constructor b 5 = " + testAnon["constructor"]);
trace("constructor b 5 = " + (testAnon["constructor"] as Class));
trace("...");

Mit TestClass wie folgt definiert:

package
{
    public class TestClass
    {
    }
}

Ergebnisse:

classname 1 = flash.display::Sprite
myclass 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor b 1 = [class Sprite]
constructor b 1 = [class Sprite]
...
classname 2 = XML
myclass 2 = [class XML]
constructor a 2 = 
constructor a 2 = null
constructor b 2 = 
constructor b 2 = null
...
classname 3 = int
myclass 3 = [class int]
constructor a 3 = [class Number]
constructor a 3 = [class Number]
constructor b 3 = [class Number]
constructor b 3 = [class Number]
...
classname 4 = src::TestClass
myclass 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor b 4 = [class TestClass]
constructor b 4 = [class TestClass]
...
classname 5 = Object
myclass 5 = [class Object]
constructor a 5 = [class Object]
constructor a 5 = [class Object]
constructor b 5 = [class Object]
constructor b 5 = [class Object]
...

Darüber hinaus alle aktuellen Tests, gibt es ziemlich guten Grund getDefinitionByName über die constructor Methoden zu verwenden. Die getDefinitionByName Methode erlaubt:

  • Adobe interne Lösungen für die (derzeitigen und künftigen) problematische Bereiche
  • entwickeln
  • Sie müssen nicht Ihren Code für zukünftige Entwicklungen Adobe ändern
  • Sie haben nicht zwei zu entwickeln (oder mehr) verschiedene Methoden der dynamischen Instanziierung.

Es kann langsamer sein, jetzt, aber in Zukunft könnte es Verbesserungen von der Adobe-Seite sein, der die Geschwindigkeit Problem zu beheben wäre.

(Zum Beispiel ist es verwendet, dass uint zu sein war viel langsamer in for-Schleifen als int, so viele Conversion-Code wurde eingerichtet, um die schnellere int zu verwenden. Es war ein ziemlich einfaches Problem zu lösen, so Adobe Fest es, und jetzt gibt es eine Menge Code, der ein veraltetes Ziel zu erreichen.)

durch einige unnötigen Reifen springt

Da die getDefinitionByName Methode in allen Fällen korrekt funktioniert, Code sollte mit dieser Methode entwickelt werden, und dann arbeitet Adobe zu erhalten, die Geschwindigkeit Problem zu beheben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top