1 00:00:00,600 --> 00:00:04,800 皆さんこんにちは 継承についての2つ目の講義では 2 00:00:04,960 --> 00:00:08,480 振る舞いの継承についての続きと 3 00:00:08,640 --> 00:00:11,800 オブジェクトにメッセージをを食った時に 何が起こるかをお教えします。 4 00:00:12,440 --> 00:00:15,320 この一連の講義のゴールは 5 00:00:15,480 --> 00:00:18,720 メッセージ送信のアルゴリズムを 理解することです。 6 00:00:19,720 --> 00:00:24,400 このアルゴリズムによって 送信されたメッセージから 7 00:00:24,560 --> 00:00:28,560 レシーバーに応じてメソッドに 変換することができます。 8 00:00:28,720 --> 00:00:32,720 つまり送られたメッセージに関連して どのメソッドが実行されるのか 9 00:00:34,320 --> 00:00:37,640 そして「self」の意味論 つまり self とは何を意味するのかです。 10 00:00:38,800 --> 00:00:40,920 第1講では 11 00:00:41,400 --> 00:00:45,320 状態についての継承は静的であることを 学びました。 12 00:00:45,480 --> 00:00:48,640 つまりクラスが定義された時に 13 00:00:49,160 --> 00:00:51,240 状態について知ることができます。 14 00:00:51,400 --> 00:00:53,840 しかし振る舞いの継承は動的です。 15 00:00:54,000 --> 00:00:56,040 プログラムが動作している時に 16 00:00:56,400 --> 00:00:58,720 オブジェクトにメッセージを送った時に 17 00:00:58,880 --> 00:01:02,000 クラスやスーパークラスから メソッドを探します。 18 00:01:02,400 --> 00:01:06,200 メッセージ送信は2ステップからなるプロセスです。 19 00:01:06,920 --> 00:01:11,400 まず第1に、メッセージにマッチする メソッドを探します。 20 00:01:11,760 --> 00:01:15,120 第2のステップとして、レシーバー上で メソッドを実行します。 21 00:01:16,760 --> 00:01:19,680 ここに、Rectangle クラスと 22 00:01:20,280 --> 00:01:22,880 ColoredRectangle クラスと 23 00:01:23,920 --> 00:01:27,760 aColoredRectangle という名前の ColoredRectangleのインスタンスがあります。 24 00:01:28,280 --> 00:01:31,760 このオブジェクトに area メッセージを送ります。 25 00:01:34,440 --> 00:01:40,200 探索アルゴリズムは area メッセージに マッチするメソッドを探します。 26 00:01:41,400 --> 00:01:43,680 メソッドを見つけて 27 00:01:44,160 --> 00:01:46,880 aColoredRectangle オブジェクト上で 28 00:01:47,880 --> 00:01:51,400 実行します。 29 00:01:52,600 --> 00:01:54,200 探索アルゴリズムは 30 00:01:54,640 --> 00:01:57,640 オブジェクトにメッセージが送られた時に 31 00:01:57,880 --> 00:02:00,000 実行すべきメソッドを特定します。 32 00:02:00,320 --> 00:02:04,560 明確に2つのステップから成っています。 メッセージ送信とメソッド実行です。 33 00:02:04,720 --> 00:02:07,920 オブジェクトプログラミングでは それらは根本的に異なるものです。 34 00:02:08,640 --> 00:02:10,760 他の言語を使う場合にも 35 00:02:10,880 --> 00:02:15,000 それら2つの区別を理解することは重要です。 36 00:02:15,320 --> 00:02:20,200 aColoredRectangle オブジェクトに area メッセージを送ったら 37 00:02:20,400 --> 00:02:23,160 探索アルゴリズムがまず最初にすることは 38 00:02:23,320 --> 00:02:26,800 レシーバーのクラスを探すことです。 39 00:02:27,440 --> 00:02:29,840 area メッセージのレシーバーは 40 00:02:30,000 --> 00:02:31,360 aColoredRectangle です。 41 00:02:31,520 --> 00:02:34,640 探索アルゴリズムはメソッド探索を 42 00:02:34,800 --> 00:02:38,720 そのオブジェクトのクラス、つまり ColoredRectangle クラスから始めます。 43 00:02:39,080 --> 00:02:41,840 そのクラスの中で area メソッドを探します。 44 00:02:42,160 --> 00:02:44,160 探索アルゴリズムは 45 00:02:44,320 --> 00:02:48,000 そのクラスでは area メソッドを 見つけることはできません。 46 00:02:48,480 --> 00:02:51,200 なので、他の場所を探します。 47 00:02:51,640 --> 00:02:54,960 スーパークラスである Rectangle の中を探します。 48 00:02:55,640 --> 00:02:57,760 そこで area メソッドが見つかります。 49 00:02:58,720 --> 00:02:59,920 そしてそのメソッドを返します。 50 00:03:00,080 --> 00:03:03,320 探索アルゴリズムはメソッドを見つけた時点で 終了します。 51 00:03:04,320 --> 00:03:09,320 2つの場合についてアルゴリズムを 辿ってみましょう。 52 00:03:10,640 --> 00:03:13,200 aColoredRectangle に 53 00:03:13,360 --> 00:03:14,680 color メッセージを送ります。 54 00:03:14,840 --> 00:03:18,360 アルゴリズムはレシーバーのクラスで 55 00:03:18,680 --> 00:03:20,920 color という名前のメソッドを探します。 56 00:03:21,440 --> 00:03:23,840 見つかるので、それを返します。 57 00:03:25,160 --> 00:03:29,600 今度は aColoredRectangle に area メッセージを送ると 58 00:03:30,320 --> 00:03:33,560 アルゴリズムはレシーバーのクラスで the receiver's class 59 00:03:33,720 --> 00:03:35,160 area メソッドを探します。 60 00:03:35,320 --> 00:03:37,920 見つからないので、スーパークラスで探します。 61 00:03:38,160 --> 00:03:40,920 見つかるので、そのメソッドを返します。 62 00:03:42,280 --> 00:03:45,520 self は常にレシーバーを表わしています。 63 00:03:45,960 --> 00:03:49,720 次の例題を見ると 64 00:03:50,320 --> 00:03:54,560 探索アルゴリズムは常にレシーバーを self としていることがわかるでしょう。 65 00:03:54,960 --> 00:03:57,800 クラス A のインスタンスがあります。 66 00:04:01,240 --> 00:04:02,920 メッセージ foo を送ります。 67 00:04:03,760 --> 00:04:06,120 探索アルゴリズムは foo を探します。 68 00:04:06,360 --> 00:04:08,120 見つかって、それを実行します。 69 00:04:10,000 --> 00:04:12,680 B new の場合には B からスタートします。 70 00:04:13,000 --> 00:04:14,880 aB は B new と同じことです。 71 00:04:15,040 --> 00:04:16,960 foo メソッドを探します。 72 00:04:17,440 --> 00:04:19,360 探索アルゴリズムはそれを見つけて 73 00:04:20,200 --> 00:04:22,000 実行して、50 を返します。 74 00:04:22,160 --> 00:04:23,440 なので、10 と 75 00:04:24,520 --> 00:04:25,320 50 が得られます。 76 00:04:25,640 --> 00:04:30,200 時間をかけて self の意味を 考えることが大切です。 77 00:04:30,560 --> 00:04:33,040 2 つの点から説明することが重要です。 78 00:04:33,400 --> 00:04:35,120 「self」 は何を表すのか? 79 00:04:36,280 --> 00:04:40,000 メッセージ送信は 80 00:04:40,280 --> 00:04:42,640 メッセージが self に送られた時 どう振る舞うのか? 81 00:04:43,160 --> 00:04:47,160 「self」と「this」は (this は Java の用語ですが) 82 00:04:47,680 --> 00:04:48,880 同じものです。 83 00:04:49,640 --> 00:04:52,560 それらは常に メッセージのレシーバーを表わしています。 84 00:04:52,880 --> 00:04:54,240 例として 85 00:04:54,560 --> 00:04:58,440 A new foo と B new foo を見ました。 86 00:04:59,040 --> 00:05:01,520 ここで、メッセージ bar を送ってみます。 87 00:05:02,480 --> 00:05:05,000 bar はインスタンスに送られます。 88 00:05:05,560 --> 00:05:08,520 bar はここで見つかって、実行されます。 89 00:05:09,360 --> 00:05:12,960 そして self に メッセージ foo を送ります。 90 00:05:13,240 --> 00:05:15,600 self はこのオブジェクトです。 91 00:05:16,800 --> 00:05:17,760 A new です。 92 00:05:18,800 --> 00:05:21,960 このオブジェクトの メソッド foo を探します。 93 00:05:22,560 --> 00:05:24,920 そのクラスの中でメソッドを探します。 94 00:05:25,480 --> 00:05:28,160 見つかります。実行して、10 を返します。 95 00:05:30,400 --> 00:05:33,560 もう1つの場合も、全く同じです。 96 00:05:33,760 --> 00:05:37,480 しかし、注意してください。 オブジェクトプログラミングの初心者は 97 00:05:37,640 --> 00:05:38,760 よくこれを誤解します。 98 00:05:39,280 --> 00:05:41,520 アルゴリズムは全く同じです。 99 00:05:42,560 --> 00:05:45,920 このオブジェクトに bar を送ります。 100 00:05:46,200 --> 00:05:47,600 bar はここでは見つかりません。 101 00:05:47,760 --> 00:05:51,120 ここで見つかります。 なのでこのbar が実行されます。 102 00:05:51,840 --> 00:05:55,520 この時点で、メッセージ foo が self に送られます。つまり 103 00:05:56,840 --> 00:05:58,520 aB すなわち B new にです。 104 00:06:00,360 --> 00:06:01,880 メッセージ foo を送ると 105 00:06:02,040 --> 00:06:05,640 アルゴリズムがそのオブジェクトのクラスで メソッドを探します。 106 00:06:06,280 --> 00:06:07,480 見つかります。 107 00:06:07,920 --> 00:06:09,160 50 が返されます。 108 00:06:09,720 --> 00:06:12,200 これがアルゴリズムの展開です。 109 00:06:12,480 --> 00:06:16,400 プロセスの各ステップを見てください。 まさに私が今言ったことです。 110 00:06:18,040 --> 00:06:20,680 この例も前の例と 111 00:06:21,080 --> 00:06:22,280 全く同じです。 112 00:06:23,480 --> 00:06:26,200 クラス B は今は空です。 113 00:06:27,360 --> 00:06:31,120 新しいクラス C が定義されて 50 を返すメソッド foo が定義されています。 114 00:06:31,440 --> 00:06:34,760 今やってみせたように アルゴリズムのプロセスを辿ってください。 115 00:06:34,920 --> 00:06:38,360 10 が得られます。 116 00:06:38,760 --> 00:06:41,760 これが最終的に実行される foo です。 117 00:06:42,120 --> 00:06:43,520 ここで 50 が得られます。 118 00:06:45,160 --> 00:06:45,960 まとめると 119 00:06:46,520 --> 00:06:50,880 「self」は Java の「this」と同じように 常にレシーバーを表わします。 120 00:06:51,560 --> 00:06:54,200 メッセージ送信は 常に2つのステップを踏みます。 121 00:06:54,680 --> 00:06:58,360 第1に、探索アルゴリズムは メソッドと、送られたメッセージの 122 00:06:59,800 --> 00:07:01,480 マッチングを探します。 123 00:07:01,680 --> 00:07:05,160 第2のステップは、見つかったメソッドを レシーバーの上で実行することです。 124 00:07:05,800 --> 00:07:09,800 探索アルゴリズムはレシーバーのクラスから 遡って辿っていきます。 125 00:07:10,200 --> 00:07:12,840 探索アルゴリズムのゴールは 126 00:07:13,080 --> 00:07:17,520 レシーバーに送られたメッセージにマッチする メソッドを見つけることです。