2010-12-14 1 views
0

Solution trouvée grâce aux réponses de tous. Vérifiez le bas de ce message. J'utilise MVC et le problème concerne mon modèle. Avec mon code je crée une planche qui à son tour crée des tuiles. Chaque tuile sur le plateau obtient une valeur X et une valeur Y. Après cela, je veux empêcher l'accès au setter pour m'empêcher de changer accidentellement la valeur encore jamais. Je pensais utiliser une constante au lieu d'une variable, mais il semble que je doive définir la valeur au moment de la création. En d'autres termes: const myConst: uint; myConst = 2; // ne fonctionne pasAS3: Comment définir une valeur d'une classe et l'empêcher d'être modifiée?

À l'heure actuelle, j'ai une solution de rechange dont je ne suis pas satisfait. Sûrement il y a une manière plus propre. Vous pouvez voir mon travail ci-dessous.

package myboardgame 
{ 
internal class Tile 
{ 
    private var _x:uint; 
    private var _y:uint; 

    private var _xLock:Boolean; // Makes sure that the X and Y values of a tile can only be set once to prevent errors 
    private var _yLock:Boolean; // " " 

    internal function set x(x:uint):void 
    { if(!_xLock) {_x = x; _xLock = true;} else { throw new Error("Trying to change the one-time write access X tile value")}} 
    internal function get x():uint 
    { return _x; } 
} 
} 

Modifier. La solution que je suis allé avec:

package myboardgame 
{ 
    internal class Tile 
{ 
    private var _x:uint; 
    private var _y:uint; 

    public function Tile(x:uint, y:uint):void 
    { 
     _x = x; 
     _y = y; 
    } 
    internal function get x():uint 
    { return _x; } 

    internal function get y():uint 
    { return _y; } 
} 
} 

Répondre

4

Si vous souhaitez définir la valeur au moment de la création, vous devez définir une constructeur explicite pour votre classe (toujours suggéré même s'il n'est pas nécessaire).

Le constructeur que vous définissez doit essentiellement avoir un paramètre au moyen duquel vous pouvez fournir une valeur à l'attribut interne. Ceci est effectué une seule fois lors de l'initialisation de l'instance.

public class Tile { 

    //these are the attributes: your instance status 
    private var x:int; 
    private var y:int; 

    //this is the class constructor 
    public function Tile(_x:int, _y:int){ 
     //here goes the initialization of your attributes and other stuff you may need 
     x = _x; 
     y = _y; 
    } 

    //then the other methods... 
} 
+0

D'accord. Mais il doit y avoir deux params. Il a aussi un 'y'. –

+0

J'ai du mal à comprendre le texte parce que je suis relativement nouveau en programmation. Je serais vraiment reconnaissant si vous pouviez écrire un exemple de code court. – Glacius

+0

Cela fonctionne. Merci d'avoir pris le temps d'écrire l'exemple. Cela m'a beaucoup aidé. Au début, je ne pensais pas que cela fonctionnerait parce que j'ai besoin d'utiliser une méthode getter pour récupérer la valeur, mais il s'avère que vous pouvez utiliser un getter sans avoir un setter. – Glacius

0

vos variables sont supposant que ne va jamais être aussi grand que uint.MAX_VALUE:

package{ 
    public class MyClass{ 
    private var _x:uint = uint.MAX_VALUE; 
    public function set x(x:uint){ 
     if (x != MAX_VALUE) 
     //error 
     _x = x; 
    } 
    } 
} 
+0

Merci. Il semble beaucoup plus propre que mon travail. Je pense que je vais utiliser cela si aucune meilleure réponse ne vient. Une question cependant: j'ai entendu dire qu'il est mauvais de déclarer une valeur avant d'exécuter une fonction, y a-t-il une part de vérité? – Glacius

+0

Je fais des jeux en flash depuis environ 3 ans, j'en ai fait plus de 20 et ça n'a jamais été un problème pour moi. Mais il pourrait y avoir des raisons cachées mystiques derrière cela, peut-être quelques problèmes avec la gestion. Mais pour autant que je sache, même Flex officiel utilise des champs prédéfinis :). Alernativement utiliser Number, mettre à NaN et vérifier isNaN() – Maurycy

+0

Je vois. J'essaie de coder autant que possible les règles et je me permets d'être plus indulgent une fois que je sais exactement pourquoi c'est une pratique courante de faire quelque chose d'une certaine manière. Je suppose que c'est une chose que je peux être un peu plus indulgent. – Glacius

0

J'utiliser des paramètres dans un constructeur comme ceci:

var Tile : Tile = new Tile(3,6); 

Ou Si vous avez besoin d'un poseur:

package 
{ 
  public class Tile 
    { 
    private var _x : uint; 
    private var _isSetX : Boolean; 
    private var _y : uint; 
    private var _isSetY : Boolean; 

    public function set x(value : uint) 
    { 
      if (_isSetX) 
     return; 
      
      _x = value; 

    } 

    ....... 


  } 
} 
+0

Merci, c'est bien ce que j'utilise maintenant. – Glacius

Questions connexes