2010-01-11 12 views
8

Ho un brutto problema. Ho due variabili stringa (nome di classe e staticmethod) memorizzare il nome di una classe ed è metodo statico devo chiamare:AS3: chiama un metodo di classe statico: i nomi di classi e metodi sono stringhe

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

Questa è la classe soggetto:

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

Funziona perfettamente. Il problema quando si commento questo (9 °) Linea:

// new Foo(); 

Senza questa linea esce con un'eccezione:

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

Come potrei fare questo senza che esemplificazione? Se ciò è impossibile, c'è un modo per istanziare la classe dalla variabile stringa? O se è ancora una cattiva pratica, come faresti? (Devo lavorare con queste due variabili stringa sconosciute.)

Grazie in anticipo.

risposta

8

Il motivo è che il compilatore eliminerà le classi non necessarie: se non si dispone di un riferimento esplicito alla classe Foo da qualche parte, non sarà presente nell'applicazione finale.

Si potrebbe fare riferimento altrove e forzarlo ancora a caricarsi, ad esempio una matrice statica di riferimenti alle classi.

+2

Questo è anche un problema comune quando si utilizza l'iniezione di dipendenza in as3. Per altre opzioni, controlla http://www.springactionscript.org/docs/reference/html/Class-inclusion.html (nota: il sito è inattivo ora, ma dovrebbe essere tornato alla fine). –

+0

Grazie mille per il collegamento;) Il sito è di nuovo attivo. – itarato

0

Dovrebbe funzionare se si inserisce solo una traccia (classClass) - che dovrebbe fornire il riferimento necessario, se ricordo correttamente queste cose.

+0

Non penso che tu abbia nemmeno bisogno di andare così lontano. Credo che se inserisci il nome della classe nel tuo codice (diverso da una dichiarazione di importazione) verrà incluso. Il compilatore è piuttosto stupido. ad esempio: Sprite; MyClass; –

+0

No, non funziona. È stato generato un errore durante l'inizializzazione di classClass. – itarato

Problemi correlati