WEBVTT

00:00:00.600 --> 00:00:04.800 align:middle
皆さんこんにちは
継承についての2つ目の講義では

00:00:04.960 --> 00:00:08.480 align:middle
振る舞いの継承についての続きと

00:00:08.640 --> 00:00:11.800 align:middle
オブジェクトにメッセージをを食った時に
何が起こるかをお教えします。

00:00:12.440 --> 00:00:15.320 align:middle
この一連の講義のゴールは

00:00:15.480 --> 00:00:18.720 align:middle
メッセージ送信のアルゴリズムを
理解することです。

00:00:19.720 --> 00:00:24.400 align:middle
このアルゴリズムによって
送信されたメッセージから

00:00:24.560 --> 00:00:28.560 align:middle
レシーバーに応じてメソッドに
変換することができます。

00:00:28.720 --> 00:00:32.720 align:middle
つまり送られたメッセージに関連して
どのメソッドが実行されるのか

00:00:34.320 --> 00:00:37.640 align:middle
そして「self」の意味論
つまり self とは何を意味するのかです。

00:00:38.800 --> 00:00:40.920 align:middle
第1講では

00:00:41.400 --> 00:00:45.320 align:middle
状態についての継承は静的であることを
学びました。

00:00:45.480 --> 00:00:48.640 align:middle
つまりクラスが定義された時に

00:00:49.160 --> 00:00:51.240 align:middle
状態について知ることができます。

00:00:51.400 --> 00:00:53.840 align:middle
しかし振る舞いの継承は動的です。

00:00:54.000 --> 00:00:56.040 align:middle
プログラムが動作している時に

00:00:56.400 --> 00:00:58.720 align:middle
オブジェクトにメッセージを送った時に

00:00:58.880 --> 00:01:02.000 align:middle
クラスやスーパークラスから
メソッドを探します。

00:01:02.400 --> 00:01:06.200 align:middle
メッセージ送信は2ステップからなるプロセスです。

00:01:06.920 --> 00:01:11.400 align:middle
まず第1に、メッセージにマッチする
メソッドを探します。

00:01:11.760 --> 00:01:15.120 align:middle
第2のステップとして、レシーバー上で
メソッドを実行します。

00:01:16.760 --> 00:01:19.680 align:middle
ここに、Rectangle クラスと

00:01:20.280 --> 00:01:22.880 align:middle
ColoredRectangle クラスと

00:01:23.920 --> 00:01:27.760 align:middle
aColoredRectangle という名前の
ColoredRectangleのインスタンスがあります。

00:01:28.280 --> 00:01:31.760 align:middle
このオブジェクトに
area メッセージを送ります。

00:01:34.440 --> 00:01:40.200 align:middle
探索アルゴリズムは area メッセージに
マッチするメソッドを探します。

00:01:41.400 --> 00:01:43.680 align:middle
メソッドを見つけて

00:01:44.160 --> 00:01:46.880 align:middle
aColoredRectangle オブジェクト上で

00:01:47.880 --> 00:01:51.400 align:middle
実行します。

00:01:52.600 --> 00:01:54.200 align:middle
探索アルゴリズムは

00:01:54.640 --> 00:01:57.640 align:middle
オブジェクトにメッセージが送られた時に

00:01:57.880 --> 00:02:00.000 align:middle
実行すべきメソッドを特定します。

00:02:00.320 --> 00:02:04.560 align:middle
明確に2つのステップから成っています。
メッセージ送信とメソッド実行です。

00:02:04.720 --> 00:02:07.920 align:middle
オブジェクトプログラミングでは
それらは根本的に異なるものです。

00:02:08.640 --> 00:02:10.760 align:middle
他の言語を使う場合にも

00:02:10.880 --> 00:02:15.000 align:middle
それら2つの区別を理解することは重要です。

00:02:15.320 --> 00:02:20.200 align:middle
aColoredRectangle オブジェクトに
area メッセージを送ったら

00:02:20.400 --> 00:02:23.160 align:middle
探索アルゴリズムがまず最初にすることは

00:02:23.320 --> 00:02:26.800 align:middle
レシーバーのクラスを探すことです。

00:02:27.440 --> 00:02:29.840 align:middle
area メッセージのレシーバーは

00:02:30.000 --> 00:02:31.360 align:middle
aColoredRectangle です。

00:02:31.520 --> 00:02:34.640 align:middle
探索アルゴリズムはメソッド探索を

00:02:34.800 --> 00:02:38.720 align:middle
そのオブジェクトのクラス、つまり
ColoredRectangle クラスから始めます。

00:02:39.080 --> 00:02:41.840 align:middle
そのクラスの中で area メソッドを探します。

00:02:42.160 --> 00:02:44.160 align:middle
探索アルゴリズムは

00:02:44.320 --> 00:02:48.000 align:middle
そのクラスでは area メソッドを
見つけることはできません。

00:02:48.480 --> 00:02:51.200 align:middle
なので、他の場所を探します。

00:02:51.640 --> 00:02:54.960 align:middle
スーパークラスである Rectangle
の中を探します。

00:02:55.640 --> 00:02:57.760 align:middle
そこで area メソッドが見つかります。

00:02:58.720 --> 00:02:59.920 align:middle
そしてそのメソッドを返します。

00:03:00.080 --> 00:03:03.320 align:middle
探索アルゴリズムはメソッドを見つけた時点で
終了します。

00:03:04.320 --> 00:03:09.320 align:middle
2つの場合についてアルゴリズムを
辿ってみましょう。

00:03:10.640 --> 00:03:13.200 align:middle
aColoredRectangle に

00:03:13.360 --> 00:03:14.680 align:middle
color メッセージを送ります。

00:03:14.840 --> 00:03:18.360 align:middle
アルゴリズムはレシーバーのクラスで

00:03:18.680 --> 00:03:20.920 align:middle
color という名前のメソッドを探します。

00:03:21.440 --> 00:03:23.840 align:middle
見つかるので、それを返します。

00:03:25.160 --> 00:03:29.600 align:middle
今度は aColoredRectangle に
area メッセージを送ると

00:03:30.320 --> 00:03:33.560 align:middle
アルゴリズムはレシーバーのクラスで
the receiver's class

00:03:33.720 --> 00:03:35.160 align:middle
area メソッドを探します。

00:03:35.320 --> 00:03:37.920 align:middle
見つからないので、スーパークラスで探します。

00:03:38.160 --> 00:03:40.920 align:middle
見つかるので、そのメソッドを返します。

00:03:42.280 --> 00:03:45.520 align:middle
self は常にレシーバーを表わしています。

00:03:45.960 --> 00:03:49.720 align:middle
次の例題を見ると

00:03:50.320 --> 00:03:54.560 align:middle
探索アルゴリズムは常にレシーバーを
self としていることがわかるでしょう。

00:03:54.960 --> 00:03:57.800 align:middle
クラス A のインスタンスがあります。

00:04:01.240 --> 00:04:02.920 align:middle
メッセージ foo を送ります。

00:04:03.760 --> 00:04:06.120 align:middle
探索アルゴリズムは foo を探します。

00:04:06.360 --> 00:04:08.120 align:middle
見つかって、それを実行します。

00:04:10.000 --> 00:04:12.680 align:middle
B new の場合には
B からスタートします。

00:04:13.000 --> 00:04:14.880 align:middle
aB は B new と同じことです。

00:04:15.040 --> 00:04:16.960 align:middle
foo メソッドを探します。

00:04:17.440 --> 00:04:19.360 align:middle
探索アルゴリズムはそれを見つけて

00:04:20.200 --> 00:04:22.000 align:middle
実行して、50 を返します。

00:04:22.160 --> 00:04:23.440 align:middle
なので、10 と

00:04:24.520 --> 00:04:25.320 align:middle
50　が得られます。

00:04:25.640 --> 00:04:30.200 align:middle
時間をかけて self の意味を
考えることが大切です。

00:04:30.560 --> 00:04:33.040 align:middle
2 つの点から説明することが重要です。

00:04:33.400 --> 00:04:35.120 align:middle
「self」 は何を表すのか？

00:04:36.280 --> 00:04:40.000 align:middle
メッセージ送信は

00:04:40.280 --> 00:04:42.640 align:middle
メッセージが self に送られた時
どう振る舞うのか？

00:04:43.160 --> 00:04:47.160 align:middle
「self」と「this」は
（this は Java の用語ですが）

00:04:47.680 --> 00:04:48.880 align:middle
同じものです。

00:04:49.640 --> 00:04:52.560 align:middle
それらは常に
メッセージのレシーバーを表わしています。

00:04:52.880 --> 00:04:54.240 align:middle
例として

00:04:54.560 --> 00:04:58.440 align:middle
A new foo と B new foo を見ました。

00:04:59.040 --> 00:05:01.520 align:middle
ここで、メッセージ bar を送ってみます。

00:05:02.480 --> 00:05:05.000 align:middle
bar はインスタンスに送られます。

00:05:05.560 --> 00:05:08.520 align:middle
bar はここで見つかって、実行されます。

00:05:09.360 --> 00:05:12.960 align:middle
そして self に
メッセージ foo を送ります。

00:05:13.240 --> 00:05:15.600 align:middle
self はこのオブジェクトです。

00:05:16.800 --> 00:05:17.760 align:middle
A new です。

00:05:18.800 --> 00:05:21.960 align:middle
このオブジェクトの
メソッド foo を探します。

00:05:22.560 --> 00:05:24.920 align:middle
そのクラスの中でメソッドを探します。

00:05:25.480 --> 00:05:28.160 align:middle
見つかります。実行して、10 を返します。

00:05:30.400 --> 00:05:33.560 align:middle
もう1つの場合も、全く同じです。

00:05:33.760 --> 00:05:37.480 align:middle
しかし、注意してください。
オブジェクトプログラミングの初心者は

00:05:37.640 --> 00:05:38.760 align:middle
よくこれを誤解します。

00:05:39.280 --> 00:05:41.520 align:middle
アルゴリズムは全く同じです。

00:05:42.560 --> 00:05:45.920 align:middle
このオブジェクトに bar を送ります。

00:05:46.200 --> 00:05:47.600 align:middle
bar はここでは見つかりません。

00:05:47.760 --> 00:05:51.120 align:middle
ここで見つかります。
なのでこのbar が実行されます。

00:05:51.840 --> 00:05:55.520 align:middle
この時点で、メッセージ foo が
self に送られます。つまり

00:05:56.840 --> 00:05:58.520 align:middle
aB すなわち B new にです。

00:06:00.360 --> 00:06:01.880 align:middle
メッセージ foo を送ると

00:06:02.040 --> 00:06:05.640 align:middle
アルゴリズムがそのオブジェクトのクラスで
メソッドを探します。

00:06:06.280 --> 00:06:07.480 align:middle
見つかります。

00:06:07.920 --> 00:06:09.160 align:middle
50 が返されます。

00:06:09.720 --> 00:06:12.200 align:middle
これがアルゴリズムの展開です。

00:06:12.480 --> 00:06:16.400 align:middle
プロセスの各ステップを見てください。
まさに私が今言ったことです。

00:06:18.040 --> 00:06:20.680 align:middle
この例も前の例と

00:06:21.080 --> 00:06:22.280 align:middle
全く同じです。

00:06:23.480 --> 00:06:26.200 align:middle
クラス B は今は空です。

00:06:27.360 --> 00:06:31.120 align:middle
新しいクラス C が定義されて
50 を返すメソッド foo が定義されています。

00:06:31.440 --> 00:06:34.760 align:middle
今やってみせたように
アルゴリズムのプロセスを辿ってください。

00:06:34.920 --> 00:06:38.360 align:middle
10 が得られます。

00:06:38.760 --> 00:06:41.760 align:middle
これが最終的に実行される foo です。

00:06:42.120 --> 00:06:43.520 align:middle
ここで 50 が得られます。

00:06:45.160 --> 00:06:45.960 align:middle
まとめると

00:06:46.520 --> 00:06:50.880 align:middle
「self」は Java の「this」と同じように
常にレシーバーを表わします。

00:06:51.560 --> 00:06:54.200 align:middle
メッセージ送信は
常に2つのステップを踏みます。

00:06:54.680 --> 00:06:58.360 align:middle
第1に、探索アルゴリズムは
メソッドと、送られたメッセージの

00:06:59.800 --> 00:07:01.480 align:middle
マッチングを探します。

00:07:01.680 --> 00:07:05.160 align:middle
第2のステップは、見つかったメソッドを
レシーバーの上で実行することです。

00:07:05.800 --> 00:07:09.800 align:middle
探索アルゴリズムはレシーバーのクラスから
遡って辿っていきます。

00:07:10.200 --> 00:07:12.840 align:middle
探索アルゴリズムのゴールは

00:07:13.080 --> 00:07:17.520 align:middle
レシーバーに送られたメッセージにマッチする
メソッドを見つけることです。

