みなさん、こんにちは。
この講義では Pharo での
クラスとメソッドの定義を説明します。
Pharo に特有なこととして
メソッドやクラスを定義する専用の 構文がない、ということがあります。
クラスやメソッドはツールで定義されます。
ツールがクラスやメソッドを生成する コンテキストを提供します。
これが Pharo で主に使う コードブラウザーです。
Nautilus（ノーチラス）です。
下の部分に
Point クラスの定義があります。
Point クラスのスーパークラスは Object クラスだと解ります。
そしてインスタンス変数として x と y があります。
スーパークラスと 2 つのインスタンス変数 x と y と
一番下にはパッケージ名があります。
このクラスが入っているパッケージです。
これからスライドの中で、新しいサブクラスを 定義する時にこんなコードを使います。
見ての通り Pharo でクラスを生成するには
スーパークラスにそのためのメッセージを 送ります。
サブクラスの名前を引数にして。
subclass:instanceVariableNames:
classVariableNames:package: は
Object クラスに送られる メッセージです。
引数として、サブクラスの名前と
インスタンス変数のリストと
パッケージの名前を付けます。
メソッド定義については
これまた下の部分にありますが
メソッドの名前
コメント
そしてメソッドのコードとなります。
メソッドはクラスに属します。
メソッドを定義する構文では
そのメソッドが属するクラスについての 情報がありません。
実際には コードブラウザでクラスを選択しますが
そのクラスが そのメソッドが属するクラスになります。
スライドの中ではメソッドが属するクラス は必要な情報なので
単純にメソッド定義の中身をコピーする わけにはいきません。
メソッド名の前に接頭辞をつけて
メソッドが属するクラスを示します。
追加するのは
クラスの名前で
定義しているメソッドを追加する 対象となるクラスを示します。
つまり、コードブラウザ上では
クラスはブラウザの中での
選択としてしか出てきません。
Integer クラスの factorial メソッド を定義します。
メッセージについて 思い出して欲しいのですが
factorial メソッドを定義していますが
=, >, *, - 等といった
二項メッセージを使います。
二項メッセージです。
factorial メソッドに再帰します。
factorial は単項メッセージで
数値オブジェクトに送られます。
そしてキーワードメッセージが 2 つあります。
IfTrue: が 2 回でて、 それと error: です。
そして最後にキャレットがあります。
返り値を返して
メソッドから脱出します。
リターンについては
Pharo ではデフォルトで
self を返します。
つまり、現在のオブジェクトです。
上に示したコードは
下に示したコードと全く同じです。
つまり、メソッドの最後にある ^ self はあってもなくても良いです。
クラスにメッセージを送ります。 クラスメソッドです。
クラスもオブジェクトなので
クラスにメッセージを送ることができます。
クラスメソッドを定義するには
Nautilus のクラスボタンを押してから
メソッドを定義してください。
スライドでは class と書くことで
クラス上で実行されるメソッドである ことを示して
クラスのインスタンスで実行される メソッドと区別します。
ここで x:y: メソッドは Point クラス上で実行されます。
Point クラスのインスタンス上では ありません。
この講義で
覚えておくことは
クラスは特別な構文で定義されるのではなく
スーパークラスへのメッセージ送信で 定義されるということ。
クラスはパッケージ内で定義されること。
パッケージ名はそのメッセージの 引数として渡されること。
全てのメソッドは public だということ。
メソッドが public であることを示す キーワードはありません。全てそうだから。
メソッドが protected や private だという概念はありません。
デフォルトでは、メソッドはレシーバ自身 つまり self を返すということ。
self 以外のものを返すためには キャレットを使います。
クラスメソッドは普通のメソッドです。
クラスメソッドを追加するには クラスボタンを押してから
メソッドを作ります。
これで第 1 週の講義はおしまいです。
来週は
Pharo の構文について より細部まで見ていきます。
ブロックや、オブジェクトインスペクター と呼ばれるツールについてです。