2010-01-11 10 views
8

मुझे एक बदसूरत समस्या है। मैं दो स्ट्रिंग चर (className और staticMethod) एक वर्ग का नाम की दुकान है और यह स्थिर विधि मैं फोन कदम उठाने होंगे:एएस 3: एक स्थिर वर्ग विधि को कॉल करें - कक्षा और विधि नाम स्ट्रिंग हैं

package { 
public class Foo { 
    public static function bar():void {trace('Foo.bar() was called.');} 
} 
} 

यह सिर्फ पूरी तरह से काम करता है:

package { 
import flash.display.Sprite; 
import flash.utils.getDefinitionByName; 
import flash.utils.getQualifiedClassName; 

public class ClassPlay extends Sprite { 

    public function ClassPlay() { 
    new Foo(); 
    var className:String = 'Foo'; 
    var staticMethod:String = 'bar'; 
    var classClass:Class = getDefinitionByName(className) as Class; 
    try { 
    classClass[staticMethod](); 
    } catch (e:Error) {} 
    } 
} 
} 

इस विषय वर्ग है। समस्या जब तुम बाहर टिप्पणी इस (9) पंक्ति:

// new Foo(); 

इस लाइन यह एक अपवाद के साथ बाहर निकल जाता है बिना:

ReferenceError: Error #1065: Variable Foo is not defined. 

कैसे मुझे लगता है कि इन्स्टेन्शियशन के बिना यह कर सकता है? यदि यह असंभव है, तो स्ट्रिंग चर से कक्षा को तुरंत चालू करने का कोई तरीका है? या अगर यह अभी भी एक बुरा अभ्यास है, तो आप यह कैसे करेंगे? (मुझे उन दो अज्ञात स्ट्रिंग चर के साथ काम करना है।)

अग्रिम धन्यवाद।

उत्तर

8

कारण यह है कि संकलक अनावश्यक कक्षाओं को बाहर कर देगा - यदि आपके पास कहीं भी Foo कक्षा का स्पष्ट संदर्भ नहीं है, तो यह आपके अंतिम आवेदन में मौजूद नहीं होगा।

आप कहीं और संदर्भ दे सकते हैं और अभी भी इसे लोड करने के लिए मजबूर कर सकते हैं - उदाहरण के लिए, कक्षाओं के संदर्भों की एक स्थिर सरणी।

+2

एएस 3 में निर्भरता इंजेक्शन का उपयोग करते समय यह भी एक आम समस्या है। अन्य विकल्पों के लिए, http://www.springactionscript.org/docs/reference/html/Class-inclusion.html देखें (नोट: साइट अब नीचे है, लेकिन अंततः वापस आनी चाहिए)। –

+0

लिंक के लिए बहुत बढ़िया धन्यवाद;) साइट फिर से है। – itarato

0

यदि आप केवल एक ट्रेस (क्लास क्लास) में फेंकते हैं तो यह काम करना चाहिए - यदि आपको यह सामान सही ढंग से याद है, तो आपको संदर्भ चाहिए।

+0

मुझे नहीं लगता कि आपको अब तक जाने की भी आवश्यकता है। मैं विश्वास करता हूं कि अगर आप अपने कोड में क्लास नाम डालते हैं (आयात विवरण के अलावा) इसमें शामिल होगा। शिकायत सुंदर गूंगा है। उदाहरण के लिए: स्प्राइट; MyClass; –

+0

नहीं, यह काम नहीं कर रहा है। कक्षा क्लास प्रारंभ होने पर त्रुटि फेंक दी गई थी। – itarato

संबंधित मुद्दे