隠蔽
識別子の隠蔽
スコープが他のスコープを囲んで同じ識別子が両方のスコープで宣言されている場合、内部で宣言された識別子が内部スコープで優先的に使用される。すなわち、内部で宣言された識別子が外部の同一の識別子を隠蔽する。
識別子が隠蔽された場合、隠蔽された識別子を参照するための特別な記法は無い。
class sample
open method void sample_method()
bool flag = true;
if(true)
bool flag = false; // ♦1
bool flag2 = flag; // ♦2
endif
endmethod
endclass
♦1 : 同じ名前の変数を定義。
♦2 : if文内のflagが参照される。flag2の値はfalse。
ただし、内部スコープで同一名の変数を宣言するまでは、外部の変数が参照可能である。
class sample
open method void sample_method()
bool flag = true;
if(true)
bool flag2 = flag; // ♦1
bool flag = false; // ♦2
flag2 = flag; // ♦3
endif
endmethod
endclass
♦1 : 外部のflagが参照される。flag2の値はtrue。
♦2 : ここから隠蔽される。
♦3 : if文内のflagが参照される。flag2の値はfalse。
更に、変数の定義文は右辺から評価されるので。
class sample
open method void sample_method()
bool flag = true;
if(true)
bool flag = flag; // ♦1
endif
endmethod
endclass
♦1 : 内部のflagが外部のflagで初期化された。外部のflagはこれ以降、隠蔽される。
参照の優先順位
識別子の隠蔽は変数名だけに限らない。識別子の名前がクラス定義の要素間で同じ場合は名前の隠蔽が起こる。
変数名がフィールド、セッタ、ゲッタの名前と一致した場合、その変数のスコープ内ではフィールド、セッタ、ゲッタにアクセスすることはできない。
名前参照の優先順位は、内部スコープの変数 > 外部スコープの変数 > フィールド > セッタ、ゲッタ、である。
変数とフィールド、セッタ、ゲッタを区別するために、"this."を使うことができる。
"this."を名前の前につけると、Riceは名前の探索をフィールド、セッタ、ゲッタに限定する。