こんにちは。この講義では
クラスメソッドを本当に理解するための 時間を設けます。
既にカウンターの演習をしましたが
クラスメソッドを使ったはずです。 上手くいきましたね。
今回はじっくり見ていって 一から十まで理解してください。
この講義では、Pharo では クラスメソッドとインスタンスメソッドには
メソッド探索のレベルでは違いはない ということを学びます。
探索アルゴリズムは 1 つしかありません。
仮想機械（VM）で定義されています。
そしてクラスメソッドは一見すると 静的（static）メソッドに似ていますが
実際には違うということが解るでしょう。
実際、クラスメソッドは動的結合されます。
クラスメソッドは実行時に探索されます。
一方、Java では静的メソッドは 動的に探索されません。
では、どうなっているのか見てみましょう。
実際、今までに探索アルゴリズムは
レシーバーのクラスから開始する ということは、わかっていますね。
もし該当するメソッドがあれば
それが返され、なければ スーパークラスを辿っていきます。
図で見てみると
Counter クラスの例では
increment メッセージを送ると 何が起こるでしょう？
まずはCounter クラスを見て
increment がここで定義されてるか 見てみます。
階層のより上位で定義されたメソッドなら
上位へ辿っていきます。
このメカニズムが 実際に Pharo で 使われているもので、他には探索はありません。
インスタンス側でもクラス側でも これが使われています。
Counter クラスの演習では withValue: メッセージを
Counter クラスに送って
インスタンスを作りました。 何が起こっているのでしょう？
Counter クラスは Counter class と呼ばれるクラスのインスタンスです。
そして探索します。 今までと同じ方法で探索します。
レシーバーのクラスを見ます。 レシーバーは Counter なので
Counter class を見ます。 するとwithValue: メソッドが見つかります。
それをレシーバーに適用して
新しいインスタンスを返します。
つまり、Counter クラスのインスタンスに メッセージを送るのと
全く同じプロセスを辿ります。
では、Pharo ではクラスとは何なのでしょう？ クラスはインスタンスです。
クラスは他と同じようなオブジェクトです。 Pharo にはオブジェクトしかありません。
クラスはメタクラスと呼ばれる 別のクラスのインスタンスです。
単に区別すれば良いだけです。 メタクラスは単にクラスです。
そのインスタンスがクラスというだけで。
違いは、インスタンスが 末端のインスタンスなのかクラスなのかです。
次にのポイントは Counter クラスは
Counter class クラスの 唯一のインスタンスです。
この Counter class は自動的に作られます。
Counter クラスを定義した時に システムが自動的に
Counter class クラスを作ります。
クラスを 1 つ作ったつもりでしょうが 実際には 2 つ作っていたのです。
Pharo では XXX クラスのクラスは
XXX class と呼ばれることを 覚えておいてください。
ここに Counter がありますが Counter のクラスは
Counter class です。 系統的ですね。
実際のところ
今まで説明なしでやっていたのですが
ブラウザで Counter クラスを見ている時は
ブラウザ上のコードは Counter classの
インスタンスで実行されます。
つまり increment は
Counter のインスタンス上で実行されますが
クラスボタンを押して クラスメソッドを定義する時は
この Counter class のインスタンス上で 実行されるコードを表示します。
実際、見てみると increment メッセージを
Counter のインスタンスに送ると Counter クラスを見ます。
見てください。 このメソッドが実行されます。
Counter クラスに withValue: メッセージを送ると
どこを見るでしょう？そのクラスです。 このリンクを辿って
メソッドがここにあります。
まとめると
Pharo では、クラスはオブジェクトです。
クラスはメッセージを 受け取ることができます。
構文を勉強した時に
Date today について説明しました。
どういうことかというと それはクラスへ送るメッセージです。
構文的に異なる要素はありません。
インスタンスへのメッセージ送信と 構文は全く同じです。
さらに、この講義で、メソッド探索は 1 種類しかないことを説明しました。
クラスメソッドは インスタンスメソッドと同様に
動的に探索されます。 どこを探索するかというと
レシーバーのクラスです。
インスタンスの場合には そのクラスを探します。
クラスインスタンスの場合には 例えば Counter クラスの場合には
メタクラスを探します。 Counter class と呼ばれるクラスです。
つまりクラスは、メタクラスという 別のクラスのインスタンスです。
そして同じメソッド探索が行われます。
これについては最終週の講義
Understanding Metaclasses で またやります。
Pharo の蓋を開けてみて
どうやって動いているのか その完全に統一されたやり方を説明します。