WEBVTT

00:00:00.400 --> 00:00:01.400 align:middle
こんにちは、みなさん。

00:00:01.640 --> 00:00:06.720 align:middle
継承とメソッド探索の第 5 回の講義です。

00:00:07.320 --> 00:00:10.320 align:middle
カバーする内容は
メタクラスでの

00:00:10.600 --> 00:00:13.120 align:middle
メッセージングと探索アルゴリズムです。

00:00:13.440 --> 00:00:14.560 align:middle
Pharo では

00:00:14.880 --> 00:00:16.400 align:middle
あらゆるものがオブジェクトです。

00:00:16.520 --> 00:00:19.400 align:middle
そしてオブジェクトはメッセージを
受け取ることができます。

00:00:19.800 --> 00:00:23.200 align:middle
そしてクラスもオブジェクトです。

00:00:23.760 --> 00:00:26.120 align:middle
オブジェクトはメッセージを
受けることができることから

00:00:26.320 --> 00:00:28.040 align:middle
クラスはメッセージを受けることができます。

00:00:28.480 --> 00:00:33.480 align:middle
レシーバーがクラスであろうが
他のオブジェクトであろうが

00:00:33.800 --> 00:00:37.040 align:middle
メッセージ機構は同じです。

00:00:38.840 --> 00:00:42.360 align:middle
メソッドを探索する方法は1つだけです。

00:00:42.720 --> 00:00:46.280 align:middle
これが探索アルゴリズムです。
何度も

00:00:46.440 --> 00:00:48.320 align:middle
前の講義で見てきました。

00:00:49.200 --> 00:00:51.560 align:middle
では、クラスにメッセージを送る例を

00:00:51.760 --> 00:00:54.200 align:middle
見てみましょう。

00:00:56.240 --> 00:00:58.160 align:middle
基本的な原則を理解してください。

00:00:58.640 --> 00:01:00.880 align:middle
クラスはオブジェクトです。

00:01:02.040 --> 00:01:04.400 align:middle
そして各オブジェクトはクラスに
結びつけらています。

00:01:04.560 --> 00:01:07.000 align:middle
つまりオブジェクトはクラスの
インスタンスです。

00:01:07.240 --> 00:01:10.520 align:middle
aNode は Node クラスのインスタンスです。

00:01:10.920 --> 00:01:15.040 align:middle
Node クラスはオブジェクトなので

00:01:16.160 --> 00:01:19.120 align:middle
Node クラスはあるクラスのインスタンスです。

00:01:19.680 --> 00:01:22.560 align:middle
あるクラスとは、Node class です。

00:01:22.880 --> 00:01:25.200 align:middle
つまり
aNode は Node クラスのインスタンスで

00:01:25.760 --> 00:01:30.120 align:middle
Node クラスはオブジェクトであり
Node class クラスのインスタンスです。

00:01:30.840 --> 00:01:33.280 align:middle
だとすると
不思議に思うかもしれません。

00:01:34.120 --> 00:01:39.280 align:middle
Node クラスはクラスで、クラスはオブジェクトで
クラスのインスタンスです。

00:01:39.600 --> 00:01:43.400 align:middle
では、Node class クラスは
どのクラスのインスタンスでしょう？

00:01:43.840 --> 00:01:47.800 align:middle
答えは次の講義でわかるでしょう。
メタクラスの講義です。

00:01:48.240 --> 00:01:50.560 align:middle
いくつかの例があります。

00:01:50.960 --> 00:01:56.880 align:middle
これは aWorkstation オブジェクトは
Workstation クラスのインスタンスです。

00:01:57.040 --> 00:02:00.480 align:middle
Workstation は Node のサブクラスで
Node は Object のサブクラスです。

00:02:00.640 --> 00:02:03.320 align:middle
ここで、この矢印に注意してください。

00:02:04.200 --> 00:02:06.360 align:middle
頭が白抜きの矢印は

00:02:07.000 --> 00:02:09.160 align:middle
サブクラス関係を示しています。

00:02:09.400 --> 00:02:12.280 align:middle
Node は Object のサブクラスです。

00:02:12.640 --> 00:02:14.760 align:middle
Workstation は Node のサブクラスです。

00:02:15.040 --> 00:02:17.600 align:middle
頭が黒く塗られた矢印は

00:02:17.920 --> 00:02:21.800 align:middle
ときどき頭が単に線で書かれた矢印で示される
こともありますが

00:02:22.160 --> 00:02:23.960 align:middle
インスタンス関係を示します。

00:02:25.320 --> 00:02:27.880 align:middle
aWorkstation は Workstation の
インスタンスです。

00:02:28.160 --> 00:02:30.600 align:middle
Workstation は Workstation class の
インスタンスです。

00:02:30.920 --> 00:02:34.280 align:middle
同じように、Object は Object class の
インスタンスです。

00:02:34.680 --> 00:02:36.160 align:middle
もしメッセージを

00:02:36.360 --> 00:02:37.880 align:middle
オブジェクト a Workstation に送ったら

00:02:39.680 --> 00:02:42.880 align:middle
探索アルゴリズムが
Workstation クラスを探索して

00:02:43.400 --> 00:02:45.640 align:middle
マッチするメソッドが見つかるまで

00:02:45.800 --> 00:02:48.240 align:middle
スーパークラスを遡っていきます。

00:02:48.720 --> 00:02:51.920 align:middle
このメカニズムは

00:02:52.440 --> 00:02:56.320 align:middle
メッセージを Workstation クラスに
送った時も全く同じです。

00:02:56.720 --> 00:03:00.440 align:middle
例えば new メッセージを

00:03:00.960 --> 00:03:04.080 align:middle
Workstation へ送ると
探索アルゴリズムは

00:03:04.280 --> 00:03:08.280 align:middle
Workstation class から
new メソッドを探します。

00:03:08.920 --> 00:03:11.160 align:middle
ここで見つかれば実行します。

00:03:11.400 --> 00:03:14.960 align:middle
見つからなければ
スーパークラスを遡っていきます。

00:03:15.120 --> 00:03:17.880 align:middle
そしてまた次のスーパークラスへ

00:03:19.000 --> 00:03:21.760 align:middle
という具合です。
この階層が続いていきます。

00:03:22.960 --> 00:03:26.880 align:middle
このスライドはメッセージを
標準的なオブジェクトや

00:03:27.040 --> 00:03:30.560 align:middle
標準的なオブジェクトとしてのクラスに
送る場合のことをまとめたものです。

00:03:31.800 --> 00:03:33.120 align:middle
覚えておくことは

00:03:33.480 --> 00:03:36.360 align:middle
クラスは他のオブジェクトと同様に
オブジェクトです。

00:03:37.040 --> 00:03:40.680 align:middle
メッセージはオブジェクトに送られます。
したがってクラスにも送られます。

00:03:41.480 --> 00:03:45.640 align:middle
探索機構は両者で全く同一です。

00:03:47.400 --> 00:03:51.280 align:middle
レシーバーのクラスから探索を始めて

00:03:51.680 --> 00:03:55.400 align:middle
継承関係の繋がりからスーパークラスを
辿って探索していきます。

00:03:55.760 --> 00:03:58.120 align:middle
マッチするメソッドが見つかるまで。

00:03:58.600 --> 00:04:02.880 align:middle
メタクラスについては "Understanding Metaclasses"
の講義で詳しく説明します。

