新しいクラスを定める(Defining New Classes)

関数の章で与えたdoubleの例は既に存在するクラスにどうやって メソッドを定めるかを示していた。Dylanプログラミングの多くの部分は新しいクラスの 定義からなっている。新しいクラスはdefine classにより作られる。

◆makeにより新しいクラスを作ることもできる。
define [ adjectives ] class class-name (superclasses) [Definition]
             slot-spec1  ;  slot-spec2  ...
end [class] [class-name]
define classはクラスを創るのに用いられる。define classはモジュール変数 class-nameを定め、その変数に格納するクラスを作成する。変数は読み出し専用に作られる。

修飾子adjectivesはクラスの特徴を記述する言葉である。記述可能な修飾子は sealed, open, primary,free, abstract, とconcreteである。詳細は ダイナミズムの制御(Controlling Dynamism) の章を見よ。

新しいクラスはsuperclassesから継承をする。superclassesはコンマで区切られた 表現の列でそれぞれの評価結果がクラスになる。リストの各要素は評価される。リストは重複した 要素を持てず、クラス異種階層(heterarchy)は循環してはならない。すなわち、クラスは直接にも 間接にも自分自身の上位クラスになれない。上位クラスは少なくとも1つ指定しなければならない。

上位クラスからのスロットの継承に加えて、新しいクラスは各slot-spec引数に対して一つの スロットを与えられる。最も簡単な形式では、slot-specは単に次のような形である:

	slot variable-name 

取得メソッドは総称関数name上に、設定関数は総称関数name-setter上に 定められる。slot-specの完全な構文は以下のスロットオプションの節で与える。 完全な構文ではスロット定義時にさらに多くのオプションを指定できる。

次の例では、新しいクラスを作り、それをモジュール変数<menu>に格納している。 このクラスのインスタンスは2つのスロットを持つ。最初のスロットは総称関数titleで読まれ、 総称関数title-setterにより設定される。2番目のスロットは総称関数actionで読まれ、 総称関数action-setterにより設定される。

define class <menu> (<object>)
   slot title;
   slot action;
 end class;

インスタンスの生成と初期化は総称関数initializemakeにより制御される。 さらに詳しいことはインスタンス生成 (Instance creation)の節を見よ。

スロットの一意性(Slot Uniqueness)

クラスで定められた、または上位クラスから継承されたスロットの取得および設定総称関数 すべての間には重複があってはならない。 このことから、継承スロットは二重定義(overridden)できないことになる。

上位クラスが複数のパスを通して継承された場合、そのスロットは一度しかカウントされない。 例えば、クラス Aが直接上位クラス B と Cを持ち、B と C 両方がDを直接上位クラスとして持つ なら、Aは Bと C両方を通して Dを継承するが、Dのスロットは一度しかカウントされない。 したがって、この多重継承はそれ自身では取得子、設定子の間の重複を引き起こさない。

もしも2つのクラスがそれぞれスロットを定義していて、それらの2つのスロットが 同じ取得かつ/または設定総称関数を持つならば、これらの2つのクラスは 共通部分を持たない(disjoint)。すなわち、 それらは決して共通の部分クラスを持つことはないし、 どんなオブジェクトも両方のクラスのインスタンスにはなれない。一方の取得関数が他方の 設定関数であっても同様である。(この場合はさらにパラメータリストの合同性のエラーを 引き起こすであろう。)


目次 索引 クラス(章見出し)、 スロットオプション(次節)