ユーザ定義クラスの宣言

自作のクラスを宣言する前に、そのクラスについて集めなければいけないデータがある。そのクラスからそんなオブジェクトを作りたいのだろうか、そのオブジェクトはどのような属性を持ち、どう振る舞えばいいのだろうか?。

ここで例題にするオブジェクトは航空機である。航空機には基本的な性格や属性がある:

  1. registration 登録番号
  2. type 形式
  3. size 大きさ
新しい航空機オブジェクトを生成するとき、これらの属性をそのクラスの新しいインスタンス(オブジェクトはクラスのインスタンスとも呼ばれる)に渡す。Object REXXにおけるクラスとそのメソッドは指令というもので宣言される。これらの指令は全て2つのコロンに指令と追加のパラメタをつけたものである。今回の例では指令の一般的なパラメタをほとんど全て使う。完全なリストはObject REXXリファレンスを参照されたい。クラス宣言指令はObject REXXプログラムの最後の部分に書き、そのクラスに属する全てのメソッドはクラス宣言指令の後に続けて書く。 指令に突き当たると、通常のプログラムの実行は停止する。メソッドを実行していても、RETURN命令の前に指令があるとその時点でメソッドは自動的に終了する。

クラスの宣言とメソッド初期化はこんな風になるだろう:

/*******************************************************/
/* Declare the aircraft class                          */
/* 航空機クラスの宣言                                  */ 
/*******************************************************/
::CLASS Aircraft

/*******************************************************/
/* Declare the INIT method for all new aircrafts. The  */
/* INIT method will be invoked for every new object of */
/* the aircraft class. It is invoked as a result of    */
/* the NEW message to the aircraft class.              */
/* Three arguments will be processed and stored in the */
/* object's instance variables:                        */
/* 全ての新しい航空機向けのINITメソッドを宣言する。この*/
/* INITメソッドはaircraft(航空機)クラスのオブジェクトが*/
/* 生成される度に、aircraftクラスへのNEWメッセージの結 */
/* 果として実行される。                                */
/* 3つの引数がオブジェクトのインスタンス変数に渡され、*/
/* 格納される:                                         */
/*      1. Registration of aircraft 登録番号          */
/*      2. Type of aircraft 形式                      */
/*      3. Size (wingspan) 大きさ(翼幅)             */
/*******************************************************/
::METHOD Init
  Expose Registration Type Size
  Use Arg Registration, Type, Size
EXPOSE命令はObject REXXにそのメソッドで使われる変数のうち、どれをオブジェクトの変数プールに入れるか知らせる(つまり、EXPOSE命令に渡される変数は特定のメソッドの局所変数ではなく、全てのクラスのメソッドで使うことができることになる)。USE ARG命令はオブジェクトの生成(NEWメッセージによる)時に渡された引数を指定された変数に代入する。

上記のようにクラスを宣言すると、これだけでaircraftオブジェクトを生成することができるようになる。前にみたように、NEWメッセージをクラスに送ればよい。結果としてINITメソッドが実行され、NEWメッセージとともに渡された引数を受取る。この指令で生成されたクラスは、クラス名の前にドットを付けたものでアクセスできる。次の行をコマンドファイルの先頭に加え、何が起きるか見よ:


/* create a new aircraft */
myPlane = .Aircraft‾New("N7650T", "Cessna 172A", 35)
say myPlane
これを実行すると、次の行がスクリーンに現れるであろう:

an AIRCRAFT
上の例で、Object REXXの新しい特徴の一つを紹介している。オブジェクトにSAY命令を行うと、そのオブジェクトはSTRINGメッセージを受け取る。オブジェクトが自前のSTRINGメソッドを持っていない場合、デフォルトのメソッドが実行され、クラスの名前に英語の不定冠詞を付けたものを返す。自前のSTRINGメソッドを定義すると、強力な出力ルーチンが得られる。次のメソッド定義を今あるクラス宣言に加えてみよ:

/*******************************************************/
/* Declare the STRING method for the aircraft class.   */
/* Return a string using the object's instance         */
/* variables.                                          */
/* aircraftクラスのSTRINGメソッドを宣言する。オブジェク*/
/* トのインスタンス変数を用いて文字列を返す。          */
/*******************************************************/
::METHOD String
  /* get access to the following instance variables */
  /* 以下のインスタンス変数にアクセスできるようにする */
  Expose Registration Type Size

  Return "A" Type "(" || Registration,
         || ") with a wingspan of" Size || "ft"
Running the improved program will result in the following line displayed on the screen: 改良版を実行すると、次の行がスクリーンに現れるであろう

A Cessna 172A (N7650T) with a wingspan of 35ft

[ Previous page | Next page | Tutorial Index | ]