初めに(Introduction)

Dylanのオブジェクトを分類(categorize)するのにクラスが用いられる。クラスはその インスタンスの構造を定める。メソッドと協力して、クラスはそのインスタンスの動作を 決めるのを手伝う。各オブジェクトはちょうど一つのクラスの直接インスタンスである。

クラスはそのインスタンスがどんなスロット(slots)を持つかを決める。スロット とはインスタンス内にあって利用できる局所的な格納領域である。これらはオブジェクトの 状態を納めるのに用いられる。

クラスはまたそのインスタンスの動作を決めるのも助ける。総称関数にオブジェクトが 引数として渡されると、総称関数はどのメソッドが実行されるべきか決めるため、 オブジェクトのクラス(と、おそらくは同一性)を調べる。

シングルトンは個々のオブジェクトを示すのに用いられるスペシャライザである。ある オブジェクトに対するシングルトンはそのオブジェクトを関数singletonに 引き渡すことで作られる。シングルトンは個々のオブジェクトの動作をカスタマイズするのに 用いられる。シングルトンはクラスと同様、特殊化に用いられるが、その特殊化は そのシングルトンオブジェクトのみに適用される。メソッドが引数の集合に適用可能か どうか決めるとき、シングルトンスペシャライザを持つ引数はシングルトンを作るのに 使われたオブジェクトと==でなければならない。

スロットとスロットへのアクセス(Slots and slot access)

スロットは他のオブジェクト指向言語でのフィールド(fields)または インスタンス変数(instance variables)にあたる。多くのスロットでは、 そのクラスの各インスタンスはそのスロットに対応する私的(private)な格納領域を持つ。 したがって、あるインスタンスはそのスロットに対しある値を持ち、別のインスタンスは また別の値を持てる。

Dylanは比較的新しいオブジェクト指向言語のいくつかをお手本にして、変数参照ではなく、 常に関数呼び出しでスロットにアクセスすることにした。[1] Dylanでは、スロットはメソッドを通してアクセスされる。スロットの値を返すメソッドは 取得メソッド(getter method)と呼ばれ、スロットの値を設定するメソッドは 設定メソッド(setter method)と呼ばれる。取得、設定メソッドは総称関数に付加される。 クラスを定めるとき、取得および設定メソッドをどの総称関数に加えるべきか指定することで、 スロットを定める。

例えば、<point>のクラス定義は次のようであるかもしれない。


define class <point> (<object>)
  slot horizontal;
  slot vertical;
end class;

この定義は<point>のインスタンスが2つのスロット、horizontalverticalを持つことを示している。最初のスロットの取得メソッドは総称関数 horizontalに加えられ、2番目のスロットの取得メソッドは総称関数verticalに 加えられる。最初のスロットの設定メソッドは総称関数horizontal-setterに、 一方、2番目のスロットの設定メソッドは総称関数vertical-setter.に加えられる。

pointの水平座標(horizontal coordinate)を得るには、次のような呼び出しを行う。

horizontal(my-point)

水平座標を10に設定するには対応する設定関数を使う:

horizontal-setter(10, my-point)
または
horizontal(my-point) := 10;

シングルトン型(Singleton types)

シングルトンは個々のインスタンスにメソッドをつけ加える方法を提供する。これにより、 ある単独のオブジェクトに対してプログラムを特殊化することができる。同じクラスの他の オブジェクトを変更する必要もないし、そのオブジェクトのためだけに全く新しいクラスを 定義する必要もない。

シングルトンは型であるが、クラスではない。それは単独のオブジェクトへのポインタを 少し越えたものである。シングルトンの唯一の目的はそのオブジェクトに特殊化した メソッドが作成できるように、オブジェクトを指し示すことである。(クラスではなく) シングルトンに特殊化したメソッドを定義することで、シングルトンオブジェクトを 区別するメソッドを定めたことになる。

シングルトンメソッドはオブジェクトの元のクラスのメソッドより特定されていると見なされる。 シングルトンは最も特定されたスペシャライザである。


? define method double (thing :: singleton(#"cup"))
    #"pint"
  end method

? double (#"cup")
#"pint"
? double (10)
20

Dylanはシングルトンがメソッドスペシャライザとして用いられたときの略記法を提供している。 次の定義は上のものと同値である。
? define method double (thing == #"cup")
    #"pint"
  end method

? double (#"cup")
#"pint"


[1]例えばSelf、また、 CLOSもある程度あてはまる。
目次 索引 クラス(章見出し)、 新しいクラスを定める(次節)