2010-12-14 11 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; } 
} 
} 

編集。あなたの変数はuint.MAX_VALUEと同じくらい大きなことになるだろうことはありませんと仮定

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

あなたが作成時に値を設定したい場合は、定義する必要があり、私が一緒に行ったソリューションクラスの明示的なコンストラクタ(必要がない場合でも常に提案されます)。

定義するコンストラクタには、基本的に内部属性に値を指定できる1つのパラメータが必要です。これは、インスタンスの初期化時に1回だけ実行されます。

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

同意します。しかし、2つのパラメータが必要です。彼はまた 'y'を持っています。 –

+0

私はプログラミングに比較的新しいので、テキストを理解するのが苦労しています。短いコード例を書くことができれば本当に感謝しています。 – Glacius

+0

それは動作します。この例を書く時間をとっていただきありがとうございます。それは私をたくさん助けました。最初は、値を取得するためにゲッターメソッドを使用する必要があるため、機能しないと思っていましたが、セッターを使用せずにゲッターを使用できることが判明しました。 – Glacius

0

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

ありがとうございました。私の回避策よりもはるかにクリーンなように見えます。より良い答えが出てこない場合、私はこれを使用すると思います。しかし、1つの質問:関数を実行する前に値を宣言するのは悪いと聞いたことはありますか? – Glacius

+0

私は約3年前からフラッシュゲームを作ってきましたが、20以上のゲームを作りました。それは決して問題ではありませんでした。しかし、その背後には神秘的な隠れた理由があるかもしれません。多分管理上の問題もあります。しかし、公式のFlexでもプリセットされたフィールドを使っていても私が言うことができます:)。 alernatively Numberを使用し、NaNに設定し、isNaN()を確認してください。 – Maurycy

+0

です。私は可能な限りルールでコード化しようとしていると、私はそれが何かを何らかの方法でやるのが普通の習慣であることを知ったら、より寛大になるようにしています。私はこれが私がもう少し寛大なことができることの一つだと思います。 – Glacius

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

関連する問題