2010-07-14 5 views
0

Je me demande si le flash.utils.getDefinitionByName (name: String): Class fonctionne avec des classes personnalisées? Y at-il un problème si la classe a un constructeur qui prend des arguments? Je dis cela parce que j'ai une classe dans un paquet de la forme packageA.packageB et quand j'indique le nom de la classe dans la fonction ci-dessus comme packageA.packageB.ClassName ne fonctionne pas. J'ai aussi essayé (avec le même résultat) la sortie de getQualifiedClass qui donne packageA.packageB :: ClassName. Des idées??getDefinitionByName fonctionne avec des classes personnalisées?

Voici une partie du code qui appartient à un fichier qui importe comme import factory.scratchers. *; tous les éléments scratch qui ont les noms AlphaScratcher, DissolveScratcheer, ExplodeScratcher, etc. L'importation ci-dessus satisfait-elle à l'exigence?

import factory.scratchers.*; 
... 
for (var iArea:uint = 0; iArea < _totalScratchAreas; iArea++) {  
       var sourceArray:Array = new Array(); 
       var currentNameArray:Array = _globalAssetNameArray[iArea]; 
       var theScratcher:Scratcher; 
       for (var index:uint = 0; index < _globalMsgArray[iArea].length; index++) { 
        // here i would like to have something like:> 
        var ScratchClass:Class = getDefinitionByName("factory.scratchers::ExplodeScratcher") as Class; 
        theScratcher = new ScratchClass(_assetGenerator, _mainSprite); 
        // instead of: - but it does not work not sprite shown on screen 
        theScratcher = new ExplodeScratcher(_assetGenerator, _mainSprite); 
        theScratcher.setBack(currentNameArray[index]);      
        sourceArray.push(theScratcher); 

        if (_globalArray[iArea][4] == OPENEDAREA) { 
         theScratcher.auto(); 
        } 
       } 

Répondre

2

Vous devez spécifier ce que signifie "ne fonctionne pas". Il est important que ce soit une erreur d'exécution ou de compilation.

entrée à getDefinitionByName doit toujours être une chaîne, du format « package.subpackage.subpackage :: classe », donc:

var MyClass:Class = getDefinitionByName("packageA.packageB::ClassName") as Class; 
var myInstance:Object = new MyClass(); 

Notez que le flash ne comprendra pas ClassName dans votre film, à moins qu'il ne soit spécifiquement mentionné quelque part dans votre code. Pour éviter cela, placez ce quelque part dans votre section principale du code:

var MyClass:ClassName; 
+0

si je viens d'importer le paquet entier des classes que je veux obtenir leur instance comme je montre dans le message original, est-ce exact? mais je ne reçois pas l'instance de la classe désirée ... – Ponty

+0

donc juste l'importation n'est pas assez je dois mettre var MyClass: ClassName et travaillé! Merci – Ponty

0

Oui, cela fonctionne avec les classes personnalisées. Assurez-vous simplement que le fichier SWF est conscient de la classe en le référant quelque part dans le code afin que sa définition soit incluse au moment de la compilation. Si vous n'utilisez la classe nulle part dans votre code, sa définition ne sera pas compilée dans le fichier SWF et vous ne pourrez donc pas la lire. Si vous l'utilisez quelque part, voici comment l'utiliser:

var t:Object; 
var type:Class = getDefinitionByName("packageA.packageB.ClassName") as Class; 
if(!type) 
    trace("can't find the definition"); 
else 
    t = new type(/* arguments to the constructor*/); 
+0

l'argument à l'intérieur du getDefinitionByName que vous décrivez est pas une chaîne et ce n'est pas dans le format que Ender indique ci-dessus. Quelle est la bonne approche? – Ponty

+0

@Ponty oops .. J'ai oublié de le citer. La syntaxe est 'pack.pack1.ClassName' [Vérifier la documentation] (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#getDefinitionByName%28%29) – Amarghosh

+0

ok merci i J'ai vérifié la documentation mais j'ai oublié la référence – Ponty

0

Si vous liez la classe personnalisée, avez-vous déjà essayé d'ajouter « importer »? Ou si vous traitez la classe personnalisée en tant que bibliothèques partagées à l'exécution, vous pouvez utiliser ApplicationDommain.getDefinition() à la place.

+0

j'ai mis un extrait de mon code dans mon message original et comme vous pouvez le voir j'ai mis l'importation mais je ne peux pas obtenir l'instance de classe. Je teste localy pour l'instant – Ponty

+0

Merci, mec! Je peux expliquer ce qui s'est passé. La classe "factory.scratchers.ExplodeScratcher" n'est jamais apparue auparavant et n'est pas définie dans le domaine d'application actuel. Pour ajouter cela dans le domaine d'application actuel. 1. Ajouter une déclaration var: var c: factory.scratchers.ExplodeScratcher la déclaration peut être globale ou locale (dans le même champ). 2. exécutez registerClassAlias ​​avant getDefinitionByName() registerClassAlias ​​("factory.scratchers.ExplodeScratcher", ExplodeScratcher); 3.définir un tableau ou un objet, qui contient la référence de la classe que vous voulez obtenir la définition – 9re

Questions connexes