AS3:如何设置类的值并防止它被更改?

时间:2010-12-14 19:02:10

标签: actionscript-3 oop model-view-controller

感谢每个人的答案找到解决方案。检查这篇文章的底部。

我正在使用MVC,问题与我的模型有关。用我的代码我创建了一个板,然后创建了瓷砖。板上的每个瓦片都获得X和Y值。在此之后,我想阻止访问setter,以防止我再次无意中更改值。

我在考虑使用常量而不是变量,但似乎我必须在创建时定义值。换句话说: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; }
 }
}

编辑。我采用的解决方案:

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 个答案:

答案 0 :(得分:4)

如果要在创建时设置值,则必须为类定义显式构造函数(即使不需要也始终建议)。

您定义的构造函数必须基本上有一个参数,您可以通过该参数为inner属性提供值。这只在实例初始化时完成一次。

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

答案 1 :(得分:0)

假设你的变量永远不会像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;
    } 
  }
}

答案 2 :(得分:0)

我会在像这样的构造函数中使用参数:

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;

    }

   .......


  }
}