2010-01-11 20 views
8

Mam brzydki problem. Mam dwie zmienne String (className i staticmethod) zachować nazwę klasy i jest to metoda statyczna Muszę zadzwonić:AS3: wywołanie metody klasy statycznej - nazwy klas i metod są łańcuchami

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

Jest to klasa Temat:

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

To działa po prostu doskonale. Problem podczas skomentować tę (9.) wiersz:

// new Foo(); 

Bez tej linii to wychodzi z wyjątkiem:

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

Jak mogłem to zrobić bez tej instancji? Jeśli to niemożliwe, czy istnieje sposób na utworzenie klasy z zmiennej łańcuchowej? Lub, jeśli nadal jest to zła praktyka, jak byś to zrobił? (Muszę pracować z tymi dwoma nieznanymi zmiennymi łańcuchowymi.)

Z góry dziękuję.

Odpowiedz

8

Powód jest taki, że kompilator usunie niepotrzebne klasy - jeśli nie masz wyraźnego odniesienia do klasy Foo gdzieś, nie będzie ona obecna w ostatecznej aplikacji.

Możesz odwołać się gdzie indziej i nadal wymusić załadowanie - na przykład statyczna tablica odwołań do klas.

+2

Jest to również powszechny problem podczas korzystania z iniekcji zależności w as3. W przypadku innych opcji sprawdź http://www.springactionscript.org/docs/reference/html/Class-inclusion.html (uwaga: witryna jest wyłączona, ale powinna wrócić). –

+0

Wielkie dzięki za link;) Witryna ponownie się uruchamia. – itarato

0

Powinien działać, jeśli po prostu rzucisz ślad (classClass) - to powinno dać ci referencję, której potrzebujesz, jeśli dobrze zapamiętam te rzeczy.

+0

Nie sądzę, że musisz nawet posunąć się tak daleko. Wierzę, że jeśli umieścisz nazwę klasy w kodzie (innym niż w instrukcji importu), zostanie ona dołączona. Komplement jest dość głupi. na przykład: Sprite; MyClass; –

+0

Nie, to nie działa. Wystąpił błąd podczas inicjowania klasy classClass. – itarato

Powiązane problemy