AS3: Как мне установить значение класса и предотвратить его изменение? - PullRequest
0 голосов
/ 14 декабря 2010

Решение найдено благодаря ответам каждого. Проверьте нижнюю часть этого поста.

Я использую MVC, и проблема касается моей модели. С моим кодом я создаю доску, которая в свою очередь создает плитки. Каждая плитка на доске получает значения X и Y. После этого я хочу запретить доступ к установщику, чтобы не допустить случайного изменения значения.

Я думал об использовании константы вместо переменной, но, похоже, мне нужно определить значение во время создания. Другими словами: const myConst: uint; myConst = 2; // не работает

Сейчас у меня есть обходной путь, который меня не устраивает. Конечно, есть более чистый способ. Вы можете увидеть мой обходной путь ниже.

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; }
 }
}

Edit. Решение, которое я выбрал:

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; }
}
}

Ответы [ 3 ]

4 голосов
/ 14 декабря 2010

Если вы хотите установить значение во время создания, вы должны определить явный конструктор для вашего класса (всегда рекомендуется, даже если он не нужен).

Определенный вами конструктор должен в основном иметь один параметр, с помощью которого вы можете указать значение для внутреннего атрибута.Это делается только один раз при инициализации экземпляра.

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 голосов
/ 14 декабря 2010

Я бы использовал параметры в конструкторе следующим образом:

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

Или, если вам нужен сеттер:

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 голосов
/ 14 декабря 2010

Предполагая, что ваши переменные НИКОГДА не будут такими большими, как 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;
    } 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...