カプセル化
定義例
前ページまでに定義したexampleクラスを以下に示します。
1: | class example |
2: | int x; |
3: | int y; |
4: | open fitter example() // デフォルトフィッタ。 |
5: | x = 0; |
6: | y = 0; |
7: | endfitter |
8: | open fitter example(int xx, int yy) // 引数二つのフィッタ。 |
9: | x = xx; |
10: | y = yy; |
11: | ef // 省略形 |
12: | open setter X(int val) |
13: | x = val; |
14: | endsetter |
15: | open getter int X |
16: | return x; |
17: | endgetter |
18: | open setter Y(int val) |
19: | y = val; |
20: | es // 省略形 |
21: | open getter int Y |
22: | return y; |
23: | eg // 省略形 |
24: | open method void Clear() |
25: | x = 0; |
26: | y = 0; |
27: | return; // オプション、無くてもよい。 |
28: | endmethod |
29: | open method example Add(int vx, int vy) |
30: | return new example(x + vx, y + vy); |
31: | endmethod |
32: | open method example Add(example ve) // 同名、引数違い。 |
33: | return new example(x + ve.x, y + ve.y); |
34: | em // 省略形 |
35: | endclass |
openメンバ
上記の定義例においてアクセス制御子openから定義が始まるメンバをopenメンバと言います。
openメンバはクラス定義の外部からドット演算子を経由して呼び出すことができます。
closedメンバ
フィールドとアクセス制御子closedから定義が始まるメンバをclosedメンバと言います。
closedメンバはクラス定義の外部からドット演算子を経由して呼び出すことができません。
クラスレベルのカプセル化
exampleクラスを使用するコードを考えます。
1: | example ex1 = new example(10, 10); |
2: | example ex2 = new example(10, 10); |
3: | example ex3 = ex1.Add(ex2); // ex3.x == 20 ex3.y == 20 |
ex1とex2は同じクラスの異なるインスタンスです。ex1のAdd(example)メソッドの呼び出しでex2のフィールド、closedメンバ、にアクセスしています。
32: | open method example Add(example ve) // 同名、引数違い。 |
33: | return new example(x + ve.x, y + ve.y); |
34: | em // 省略形 |
Riceは、クラス定義の内部に限り、クラスの全てのインスタンスのclosedメンバに無制限でアクセスできます。このようなカプセル化を"クラスレベルのカプセル化"と呼びます。