2010-12-14 41 views
0

解答发现感谢大家的答案。检查这篇文章的底部。AS3:如何设置类的值并防止它被更改?

我正在使用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; } 
} 
} 

编辑。我去解决办法:

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

回答

4

如果你想设置在创建时必须定义的值你的类的显式构造函数(即使不需要时也总是建议)。

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

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

同意。但是必须有两个参数。他还有一个'y'。 – 2010-12-14 19:22:58

+0

我很难理解文本,因为我对编程相对比较陌生。如果你能写一个简短的代码示例,我会很感激。 – Glacius 2010-12-14 19:25:45

+0

它的工作原理。感谢您花时间写出这个例子。这对我帮助很大。起初,我不认为它会工作,因为我需要使用getter方法来检索值,但事实证明,您可以使用getter而无需setter。 – Glacius 2010-12-14 19:44:40

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

谢谢。它看起来比我的工作更干净。如果没有更好的答案出现,我想我会使用它。但是有一个问题:我听说在运行函数之前声明一个值是不好的,这有什么道理吗? – Glacius 2010-12-14 19:27:27

+0

我已经在Flash里制作了大约3年的游戏,制作了超过20种游戏,这对我来说从来都不是问题。但是背后可能存在一些神秘的隐藏原因,或许是管理上的一些问题。但据我所知,即使官方Flex使用预设字段:)。非法使用数字,设置为NaN,并检查isNaN() – Maurycy 2010-12-14 20:41:40

+0

我明白了。我试图尽可能遵守规则,并且一旦我确切地知道为什么以某种方式做某件事是常见做法,我就会更加宽松。我想这是一件我可以稍微宽松一点的事情。 – Glacius 2010-12-14 23:22:32

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; 

    } 

    ....... 


  } 
} 
+0

谢谢,这确实是我现在使用的。 – Glacius 2010-12-14 19:46:59