カテゴリー
未分類

private

icon_flash8.jpgクラス内でprivate宣言しているのに何故にアクセスできるんだ?と不思議に思っていたのだけど、厳密な型宣言をしていなかっただけでした(汗

class Test{
private var hogehogoe:String = “hogehoge”;
}
—-
var test1 = new Test();
trace(test1.hogehoge)//hogehoge
var test2:Test = new Test();
trace(test2.hogehoge)//メンバーがプライベートで、アクセスできません。

あーお恥ずかしい。んでもちと疑問なのだけど、たとえば関数内でClass定義して、それを_rootとか_globalに配置したい場合ってどするの?
たとえばこんな感じ

function init(){
var test3:Test = new Test();
}
//—–
init();
trace(test3.hogehoge);//undefined

このとき”var”つけたらローカル変数になってしまうー(汗
なんというか世の中AS3なのに、こんなところで躓いているオデは一体・・・。


=====20060826追記=====
なんだかまた良くわからなくなったので整理してみる。
元々は定数の検証をしていて行き着いた問題なので最初からキチンと流れを追ってみる。

Flash では、プライベートメンバー変数を使用して独自のカスタムクラスを作成する場合を除き、ユーザー独自の定数値を作成する方法はありません。また、Flash 内で “読み取り専用” の変数を作成することはできません。

これはOK。

変数名は小文字で指定するか、大文字と小文字を混在して指定するのに対し、定数 (変化しない変数) の名前は大文字で指定します。次の ActionScript に示すように、単語間はアンダースコアで区切ります。
静的定数は大文字で記述し、単語間はアンダースコアで区切ります。for ループのカウンタ値として使用する 1、0、-1 のような場合を除き、コード内に数値定数を直接に記述しないでください。

これもOK。
ということで、Classは

class ConstExample{
public static var EXAMPLE_STATIC:String = “Global access”;
public var EXAMPLE_PUBLIC:String = “Public access”;
private var EXAMPLE_PRIVATE:String = “Class access”;
}
####
trace(ConstExample.EXAMPLE_STATIC);// 出力 : Global access”
trace(ConstExample.EXAMPLE_PUBLIC);// エラー
trace(ConstExample.EXAMPLE_PRIVATE);// エラー

を実行するとL2,3があるので

**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 3:参照されているプロパティには、静的属性がありません。
trace(ConstExample.EXAMPLE_PUBLIC);
**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 5:参照されているプロパティには、静的属性がありません。
trace(ConstExample.EXAMPLE_PRIVATE);

こんな感じ。これはEXAMPLE_PUBLIC、EXAMPLE_PRIVATEがじゃないので当然。で、これらにアクセスするために

var myExample:ConstExample = new ConstExample();
trace(myExample.EXAMPLE_PUBLIC);

これは当然、publicなのでOK。
次に

trace(myExample.EXAMPLE_PRIVATE);

これは当然エラー。

**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 12:メンバーがプライベートで、アクセスできません。
trace(myExample.EXAMPLE_PRIVATE);

が戻ってくる。
さてここで振り出しに最初の話に戻る。
厳密な型宣言を行わない場合

var myExample2 = new ConstExample();
trace(myExample2.EXAMPLE_PUBLIC);
trace(myExample2.EXAMPLE_PRIVATE);
===出力===
Public access
Class access

となってしまう。というのがそもそもの話。
で、型宣言を行うには”var”が必要になってしまうので、もし関数内でClass変数を定義させたばあい一時変数になっちゃうじゃん。ということを疑問に思った。つまり、

function sample_func1() {
var myExample3:ConstExample = new ConstExample();
trace(myExample3.EXAMPLE_PUBLIC);
}
sample_func1();
trace(myExample3.EXAMPLE_PUBLIC);

L6の関数外での呼び出しには”undefined”となり対応できない。んでどうすりゃいいのか?と思っていたらTakaさんからアドバイス貰って

var myExample4:ConstExample;
function sample_func2() {
myExample4 = new ConstExample();
trace(myExample4.EXAMPLE_PUBLIC);
}
sample_func2();
trace(myExample4.EXAMPLE_PUBLIC);
===出力===
Public access
Public access

となる。
で、すべてOK。
なのだが、何故かエントリーの最初のClassだと

**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 5:’hogehoge’ という名前のプロパティはありません。
trace(test2.hogehoge);

となる。本来は「メンバーがプライベートで、アクセスできません。」というエラーが戻ってくることを期待していたのだけど・・・。なんか間違っているのかな?ということでそのスクリプトを検証してみる。
=====(一度終わり)=====
さて、問題の”hogehoge”を追加してみた。

class ConstExample{
public static var EXAMPLE_STATIC:String = “Global access”;
public var EXAMPLE_PUBLIC:String = “Public access”;
private var EXAMPLE_PRIVATE:String = “Class access”;
private var hogehoge:String = “hogehoge”;
}
=====出力=====
**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 5:’hogehoge’ という名前のプロパティはありません。
trace(test2.hogehoge);

ちなみにこれは”private”を外しても同じエラー。
大文字小文字の問題かなと思って、”hogehoge”を”HOGEHOGE”に変えて検証したら、
「メンバーがプライベートで、アクセスできません。」
との期待通りのエラーが出た。
原因が大文字記述にあったのかと思ったのですが、念のため再び”hogehoge”に戻してみると
「メンバーがプライベートで、アクセスできません。」
と正常な動作をするようになった・・。
理由がよくわからないなぁ・・・。
一応asoファイルとかこまめに消していたんだけど・・・。
まぁ動くようになったから結果オーライなのかもしれんが、原因が分からないのが気持ち悪い・・。

「private」への7件の返信

test1のケースで表示されるということは、
カプセル化(private指定)した意味ってないですよね?
AS3の仕様、これでいいんでしょうか?・・・とちょっと疑問を感じてしまいました(^^;

あ、AS3じゃなくて、これはAS2レベルのお話です。なのでAS3だとキチンとアクセスできないかもしれないです。
いやー、元々Flashってゆるゆるだったのでとっつき易かったのですが、もうちょっとここまでくる敷居高いですねえ・・。

AS2でしたか(^^;
ゆるゆるでなくなった分、
バグにはまることも減る・・・とポジティブに考えるって手もありますよ!

こんな感じでどうでしょう?
var test3:Test
function init(){
test3 = new Test();
}
init();
trace(test3.hogehoge);

ありがとうございますー。今大阪なのできちんと検証できてないのですが、宣言だけ先にしてしまうってことですね。このやり方Classの中以外でも可能なんですね・・知りませんでした・・汗
ヤベーヤベー

ちと検証しようと思ったら、何故だか一番最初のスクリプトサンプルが動作しなくなった。
===
**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 5:’hogehoge’ という名前のプロパティはありません。
trace(test2.hogehoge);
===
とか言われる。あら?
なして?

検証しなおしてみました。
Takaさんのアドバイスでいけそうです。アリガトウございました。
そして「hogehoge’ という名前のプロパティはありません。」という問題については追記のとおりよくわからない結末を迎えてしまいました・・・。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です