Home About Rice Downloads Documents Others Cooker CookerGX
Documents  >  Tutorial  >  fields
フィールド

この章の目的。

クラス定義を構成する基本要素である、フィールドについて学びます。

フィールド。

フィールドは、クラスの個々のインスタンスの状態を保持するためのデータです。

まず、Circle.88のフィールド宣言部分を見てみましょう。

1:

// -----------------------------------------------Fields

2:

int _x; // x-coordinate of the center point. The range is from 11 to 589.

3:

int _y; // y-coordinate of the center point. The range is from 11 to 589.

4:

int _radius;

5:
6:

document _doc;

7:

window _win;

8:

element _box; //div element. A container of canvas element.

9:
10:

bool _fitted; // Whether it has been initialized.

11:
12:

int _hor; //Horizontal movement direction and amount. plus value, it will move right. minus value, it will move left.

13:

int _ver; //Vertical movement direction and amount. plus value, it will move down. minus value, it will move up.

14:
15:

int _top; // It is top of the _box in pixels.

16:

int _left; // It is left of the _box in pixels.

17:
18:

timer _tt; // A timer for moving.

フィールドの宣言は、以下の形式です。


クラス名 フィールド名 ;


これは、クラス名とフィールド名の二つの識別子の連続がセミコロンで終わる文です。

フィールド名が異なり、クラス定義内の他のメンバー定義の外ならば、任意の場所で、いくつでも宣言することが出来ます。

宣言されたフィールドは、クラス定義の任意の場所で、フィールド名で参照できます。

クラス名。

クラス名は、フィールドに拘束されるインスタンスの型を表します。

フィールド名。

フィールド名は、フィールドにアクセスするために使う識別子です。

フィールド宣言の終了。

フィールド宣言の終了は、セミコロンで表します。

フィールド宣言の特徴。

Riceのフィールドには、いくつかの特徴があります。


宣言は許されるが、定義することは許されない。

未知のクラスも宣言することが出来る。

クラス定義以外から、直接参照する方法が無い。

宣言と定義

Riceのフィールドは、宣言と同時に定義することが出来ません。

すなわち、

int _iField = 10;

のような記法(定義)は認められません。フィールドが適切に初期化されているかどうかは、フィッタの責任です。

フィールド宣言は、フィールドの型と名前をクラスと関連付けるためだけの、単なる場所取りです。

未知のクラスの宣言

フィールドを宣言する前に、そのフィールドのクラス(型)の定義が終了していれば、そのクラスのインスタンスがフィールドとして格納されます。

しかし、フィールド宣言の前に、フィールドのクラスを定義できない場合があります。

例えば、


// クラスAの定義

class A

B _b; // B型(クラス)のフィールド。未知のクラスBのフィールドの宣言。

...

// フィッタ

open fitter A(B b)

_b = b;

...

endfitter

...

endclass


// クラスBの定義

class B

A _a; // A型(クラス)のフィールド

...

endclass


上記のように、相互に参照し合うクラスの場合は、未知のクラスのフィールドを宣言する必要があります。

このような場合、Riceは、仮置き用のクラス(dummy class)を使ってクラス定義を進めてしまいます。当然のことですが、このようなクラスは、不完全な状態にあります。

不完全なクラスを適切に初期化するのは、フィッタの責任です。


上記の例のクラスAとBならば、Aのフィッタを使って、


B bInstance;

A aInstance = new A(bInstance);


相互に参照し合うインスタンスは、この方法で正しく初期化されます。

アクセス制御

フィールド以外のメンバーは、定義の先頭で適切なキーワード(open か closed)を使うことによって、アクセスレベルを制御出来ます。

フィールドは、その様なアクセス制御のための記法を持ちません。フィールドに、フィールド名を使って直接アクセスできるのは、クラス定義の内部だけです。


フィールド名が、クラスのインターフェースの役割を担うことはありません。フィールドへのアクセスが必要なときは、セッタかゲッタを定義してください。

クラス定義の内部では、そのクラスの全てのインスタンスのフィールドに、クラス名を使って直接アクセス出来ます。

Copyright © Rice All rights reserved.