2010-03-03 4 views
1

Je souhaite passer les arguments de configuration à une classe. Ce sont tous les variables facultatives qui entrent dans la configuration de la classe - et devraient pouvoir fonctionner dans n'importe quel ordre. Pour le moment je passe juste à travers les vars optionnels de façon régulière. En supposant que le constuctor était comme suit:as3: utiliser un objet pour passer des arguments dans n'importe quel ordre - configuration de classe

private var _reqVar:String; 
private var _optVar1:String; 
private var _optVar2:String; 

public function Constructor(reqVar:String, optVar1:String = "empty", optVar2:String = "empty){ 

    // set the variable to equal the arguments here... 

} 

le problème est pour l'utilisateur final, où instancier la isnt classe particulièrement lisible (en particulier lorsque la liste des arguments peut se développer assez grand)

Idéalement je voudrais comme pour passer les arguments si semblable à ceci:

var instance:ClassType = new ClassType(reqVar, {width:100, height:100, speed:4, lives:3}) 

qui est là encore assez simple. où je trébuche sur sont les points suivants:

  • assignant l'argument du var de la même clé (je sais en php pour référencer un nom de variable à partir d'une clé que vous pouvez utiliser $$ key = valeur $, est-il un équivalent en AS3?)
  • affiche une erreur (en utilisant la méthode du « jet ») pour les noms de variables non pris en charge par la classe

toute aide appréciée.

Répondre

2

réponse Mise à jour:

public function Test(reqVar, optionalVars:Object) 
{ 
    for (var prop:String in optionalVars) 
    { 
     try 
     { 
      this[prop] = optionalVars[prop]; 
     } 
     catch (error:Error) 
     { 
      throw new Error("Unknown property: " + prop); 
     } 
    } 

} 

Ainsi, les réponses à vos questions sont:

  • Vous attribuez à une propriété ou variable par nom en utilisant object[NAME], dans ce cas this['propertyName']. Vous pouvez vérifier si une propriété existe en utilisant hasOwnProperty. Mise à jour: Si vous souhaitez également affecter à une variable autre que les propriétés, je ne pense pas que vous pouvez vérifier si elles existent. Pour résoudre ce problème, vous pouvez supposer qu'ils existent, leur attribuer et obtenir une erreur lorsque vous utilisez un nom de variable non valide. Vous pouvez aussi envelopper la tâche dans un try ... catch block et lancer une exception plus jolie comme je l'ai montré ci-dessus.
+0

Star d'or pour vous bon monsieur! Merci beaucoup. – Beans

+0

Je viens de marquer cela comme sans réponse car j'ai une autre question - cela ne semble pas pouvoir définir les valeurs que les vars sont déclarées privées - dès que je les déclare comme publiques cela fonctionne très bien. Doit on s'y attendre? Évidemment, je voudrais les garder privés si possible de contrôler l'intégrité des valeurs. – Beans

+0

Bon point Haricots. Je suis nouveau à AS3 moi-même et ne m'étais pas rendu compte que hasOwnProperty est limité aux propriétés, comme le nom implique :) :) J'ai mis à jour ma réponse pour qu'elle fonctionne maintenant avec n'importe quelle variable. –

Questions connexes