Next: , Previous: , Up: The oof.fs model   [Contents][Index]


6.24.4.2 Basic oof.fs Usage

このセクションでは、 objects (see Basic objects.fs Usage) と同じ例を使用します。

以下のようにして graphical オブジェクト(図形オブジェクト)のクラスを定義できます:

object class graphical \ "object" is the parent class
  method draw ( x y -- )
class;

このコードは、 draw 操作を持つクラス graphical を定義します。 任意の graphical オブジェクトに対して draw 操作を実行できます。例:

100 100 t-rex draw

ここで、 t-rex (訳注: 恐竜ティラノサウルス) はオブジェクトまたはオブジェクト・ポインターであり、 たとえば次のように作成されます: graphical : t-rex

graphical オブジェクトを作成するにはどうすればよいでしょうか? 現在の定義では、 有用な graphical オブジェクトを作成できません。 クラス graphical は graphical オブジェクト一般を記述しますが、 具体的な graphical オブジェクト・タイプを記述しません(C++ ユーザーはこれを「抽象クラス」(abstract class)と呼びます)。 たとえば、 クラス graphical にはセレクター draw のメソッドがありません。

具体的な graphical オブジェクトのために、 クラス graphical の子クラスを定義します。 例:

graphical class circle \ "graphical" is the parent class
  cell var circle-radius
how:
  : draw ( x y -- )
    circle-radius @ draw-circle ;

  : init ( n-radius -- )
    circle-radius ! ;
class;

ここでは、 クラス circlegraphical の子として、 フィールド circle-radius とともに定義します。 セレクター draw および init の新しいメソッドが定義されています(init は、 graphical の親クラスである object で定義されています)。

いまや、 以下のコマンドを使用してディクショナリ内に circle を作成できます:

50 circle : my-circle

:init を呼び出し、 フィールド circle-radius を 50 で初期化します。 以下のようにして、この新しい circle を (100,100) に描画できます:

100 100 my-circle draw

注意: セレクターを呼び出すことができるのは、 受信オブジェクトが、 セレクターが定義されたクラス、またはその子孫の 1 つに属している場合のみです。 たとえば、 draw は、 graphical またはその子孫(例: circle)に属するオブジェクトに対してのみ呼び出すことができます。 このクラス階層で定義されていないセレクターを呼び出そうとすると、 スコープ・メカニズムがチェックするため、 コンパイル時にエラーが発生します。