Home About Rice Downloads Documents Others Cooker CookerGX
Documents  >  Refernce  >  hiding
隠蔽

識別子の隠蔽

スコープが他のスコープを囲んで、同じ識別子が両方のスコープで宣言されている場合、内部で宣言された識別子が、内部スコープで優先的に使用される。すなわち、内部で宣言された識別子が、外部の同一の識別子を隠蔽する。

識別子が隠蔽された場合、隠蔽された識別子を参照するための特別な記法は無い。必要に応じて隠蔽を避けるのは、プログラマの責任である。

例えば


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で初期化された。これ以降、隠蔽される。

参照の優先順位

識別子の隠蔽は、変数名だけに限らない。識別子の名前がクラス定義の要素間で同じ場合は名前の隠蔽が起こりうる。

例えば、変数名がフィールド、セッタ、ゲッタの名前と一致した場合、その変数のスコープ内では、フィールド、セッタ、ゲッタにアクセスすることはできない。

名前参照の優先順位は、内部スコープの変数 > 外部スコープの変数 > フィールド > セッタ、ゲッタの順である。つまり、この優先順位で名前の隠蔽が起こる。

変数とフィールド、セッタ、ゲッタを区別するために、"this."を使うことができる。

"this."を名前の前につけると、Riceは名前の探索をフィールド、セッタ、ゲッタに限定する。

しかし、"this."を用いても、フィールド、セッタ、ゲッタの間では、名前の隠蔽は起こりうる。

Copyright © Rice All rights reserved.