« クラスメンバーにアクセスする | メイン | 暗黙的なgetterメソッドとsetterメソッド »

メンバーアクセスの制限(publicとprivate)

publicとprivateは、ほかのクラスやインスタンスからのプロパティ参照やメソッド実行にアクセスに制限を付けるためのキーワードです。デフォルトではメンバーアクセスに制限がなく自由に利用できますが、これは次の例に示すpublicキーワードが省略されている状態と言えます。

sample→ex04-02/publicフォルダ

クラス定義ファイル:MyClass01.as
class MyClass01 {
public var counter:Number = 0;
//コンストラクタ
public function MyClass01() {
}
//メソッド
public function countUp() {
counter++;
return ("counterの値は" + counter);
}
}


デフォルトでは、クラス定義されているプロパティを調べたりメソッドを実行したりすることをほかのクラスやインスタンスから自由に行えますが、これにアクセス制限を付けることができます。
次のBallPubクラスは動き回るボールを作ります。ボールは320×240の領域内で動き回り、壁に当たると跳ね返ります。

sample→ex04-02/privateフォルダ

クラス定義ファイル:BallPub.as
class BallPub {
//パブリック変数
public var mc;
public var dx;
public var dy;
//コンストラクタ
function BallPub(target:MovieClip, x:Number, y:Number) {
this.mc = target;
this.dx = x;
this.dy = y;
}
//ボールの動き
function f1() {
//壁で跳ね返る
if ((mc._x < 0) || (mc._x > 320)) {
dx *= -1;
}
if ((mc._y < 0) || (mc._y > 240)) {
dy *= -1;
}
//ボールの移動
mc._x += dx;
mc._y += dy;
}
}

BallPubクラスのmc、dx、dyはパブリック変数なので、ほかのクラスから参照して値を変更することができます。privateEx1.flaではmyBtnボタンをクリックするたびにdxとdyの値に-1を掛けて移動方向を反転してます。


フレームアクション:privateEx1.fla
var obj1:BallPub = new BallPub(ball_a, 5, 4);
//publicなメソッドにアクセスする
this.onEnterFrame = function () {
obj1.f1();
};
//publicなプロパティにアクセスする
//ボタンクリックで移動方向を反転する
myBtn.onPress = function(){
obj1.dx *= -1;
obj1.dy *= -1;
}

図4-2-1 ボタンをクリックするとボールの動く向きが反転します。


次のBallPvクラスはBallPubクラスと同じスクリプトですが、mc、dx、dyがプライベート変数になってます。このため、BallPvクラスのように外から移動速度を変更することができません。

クラス定義ファイル:BallPv.as
class BallPv {
//プライベート変数
private var mc;
private var dx;
private var dy;
//コンストラクタ
function BallPv(target:MovieClip, x:Number, y:Number) {
this.mc = target;
this.dx = x;
this.dy = y;
}
//ボールの動き
function f1() {
//壁で跳ね返る
if ((mc._x < 0) || (mc._x > 320)) {
dx *= -1;
}
if ((mc._y < 0) || (mc._y > 240)) {
dy *= -1;
}
//ボールの移動
mc._x += dx;
mc._y += dy;
}
}


次のようにインスタンスからプライベート変数のdx、dyにアクセスするとその部分がコンパイルエラーになります。

var obj1:BallPv = new BallPv(ball_a, 5, 4);
//publicなメソッドにアクセスする
this.onEnterFrame = function () {
obj1.f1();
};
//以下はプライベート変数にアクセスするのでコンパイルエラーになる
myBtn.onPress = function(){
obj1.dx *= -1;
obj1.dy *= -1;
}

note:
privateの指定はスクリプトの実行時に変数やメソッドへのアクセスを制限するというものではなく、厳密なデータ型などと同様にコンパイル時にチェックされる制限事項です。

*訂正 (2006.06.19 )
初版 p.128、p.130
初版では論理和の演算子orを使っていました。orは使用を推奨されていない演算子なので、orの代わりに||を使ってください。申し訳ないです。(う〜ん、ちょうどこれを書いている頃にLingoを使っていたのかも・・・・)

訂正前:
//壁で跳ね返る
if ((mc._x < 0) or (mc._x > 320)) {
dx *= -1;
}
if ((mc._y < 0) or (mc._y > 240)) {
dy *= -1;
}

訂正後:
//壁で跳ね返る
if ((mc._x < 0) || (mc._x > 320)) {
dx *= -1;
}
if ((mc._y < 0) || (mc._y > 240)) {
dy *= -1;
}

投稿者 oshige : 2005年2月22日 11:51