このセクションでは、 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;
ここでは、 クラス circle
を graphical
の子として、 フィールド 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
)に属するオブジェクトに対してのみ呼び出すことができます。 このクラス階層で定義されていないセレクターを呼び出そうとすると、
スコープ・メカニズムがチェックするため、 コンパイル時にエラーが発生します。