كيف يمكنني الحصول على من مثيل من فئة إلى فئة الكائن في ActionScript 3?

StackOverflow https://stackoverflow.com/questions/203969

سؤال

كيف تحصل على مثيل أكشن من الدرجة Class من مثيل تلك الفئة ؟

في بيثون ، وهذا من شأنه أن يكون x.__class__;في جاوة ، x.getClass();.

أنا على علم بأن بعض الرهيب الخارقة توجد للقيام بذلك, ولكن أنا أبحث عن المدمج في اللغة منشأة ، أو على الأقل مكتبة الروتينية التي بنيت على شيء موثوق بها.

هل كانت مفيدة؟

المحلول

ويمكنك الحصول عليه من خلال الخاصية "منشئ" من فئة كائن قاعدة. أي بمعنى:.

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

نصائح أخرى

ولأي سبب من الأسباب لا يمكن أن تفعل هذا؟

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]

وأنا لا أعرف وسيلة لتجنب جولة تنطلق من خلال سلسلة، ولكن يجب أن تعمل بشكل جيد بما فيه الكفاية.

المقبولة (حاليا الأكثر شعبية الجواب) لديها بعض العيوب.الجواب يخدم في هذه الحالة استخدام, ولكن التعليقات توسعت الإجابة على ما يبدو الحل العام.

لكنها ليست من نوع آمن الحل في بعض الحالات, فإنه لا يتناول جميع الأشياء الممكنة.فكرة أن XML غير معتمد وقد عولجت جيدا بما فيه الكفاية هنا وفي أماكن أخرى ، ولكن من نوع آمن الفكرة لم.

الافتراض هو أنه كائن الفئة التي تم إنشاؤها من قبل مبرمج.وهنا بعض الاختبارات التي وضعت (هذا الوضع الدقيق ، ولكن الاختبار المحلي).ملاحظة int نتائج الاختبار:

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("...");

مع TestClass تعريف:

package
{
    public class TestClass
    {
    }
}

النتائج:

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]
...

أبعد من أي اختبار ، هناك جيدة إلى حد ما سبب استخدام getDefinitionByName على constructor الأساليب.على getDefinitionByName الأسلوب يسمح :

  • أدوبي تطوير الحلول الداخلية ل (الحالية والمستقبلية) إشكالية المناطق
  • فإنك لن تضطر إلى تغيير التعليمات البرمجية الخاصة بك في المستقبل أدوبي التطورات
  • ليس لديك إلى وضع اثنين (أو أكثر) منفصلة أساليب ديناميكية مثيل.

قد يكون أبطأ الآن ولكن في المستقبل قد يكون هناك تحسينات من أدوبي الجانب من شأنها أن تعالج مسألة السرعة.

(على سبيل المثال ، كان عليه أن يكون أن uint كان أبطأ بكثير في الحلقات من int, لذلك الكثير من كود التحويل أنشئت باستخدام أسرع int.كانت بسيطة إلى حد ما مسألة حل لذلك أدوبي ثابتة, و الآن هناك الكثير من التعليمات البرمجية التي يقفز من خلال بعض لا لزوم لها الأطواق لتحقيق قديمة الهدف.)

منذ getDefinitionByName الأسلوب يعمل بشكل صحيح في جميع الحالات يجب أن يكون الكود تطويرها باستخدام هذا الأسلوب ، ومن ثم العمل على Adobe لإصلاح مسألة السرعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top