そして最後に、汎化には継承というとても重要な性質があると述べて終わりました。
今回は、その継承とはどういうことかについて考えてみます。
コンテンツ
スーパークラスとサブクラス
汎化とは、具体的なモノから、それを含むより抽象的なものを探し出すことでした。そして特化とは、抽象的なモノからより具体的なモノを探し出すことでした。
このとき、具体的なモノに対して、それを含むより抽象的なモノのことを、スーパークラスといいます。
逆に、抽象的なものに対して、具体的なモノのことをサブクラスといいます。
例えば、料理はカレーのスーパークラスであり、カレーは料理のサブクラスです。
このスーパークラスとサブクラスという言葉は、かなり頻繁に使う言葉ですので、覚えておいてください。
特化のことを、よくサブクラス化といいます。
なぜか、汎化のことをスーパークラス化とはあまり言わないんですけどね。
料理 + ? = カレー
ところで、サブクラスは、スーパークラスの特徴を受け継ぎます。カレーは料理の特徴を受け継ぐわけです。
「特徴を受け継ぐ」とは、より具体的に言えば、つまり属性と振る舞いを受け継ぐということになります。
この、属性や振る舞いを受け継ぐことを「継承」といいます。
例えば、料理クラスを以下のように定義してみます。
料理クラス
- 属性
- レシピ
- おいしさ
- 振る舞い
- 空腹を満たす
カレークラス
- 属性
- レシピ
- おいしさ
- 辛さ
- ルーの色
- 振る舞い
- 空腹を満たす
- 汗をかかす
サブクラスは、スーパークラスの属性と振る舞いを全て継承します。
(ソフトウェア開発者の方は、コンストラクタとプライベートメンバはこれに含まれない ― 継承されないことにご注意ください)
サブクラス化するというのは、つまりスーパークラスの特徴に、新しい特徴を付け足すことで、新しい何かを定義することだと言うこともできます。
料理 + (辛さ・ルーの色・汗をかかす) = カレーというわけです。
おもしろい考え方だと思いませんか。
逆に、料理はさらに上位のクラスである「食べ物」クラスから何を継承しているのでしょうか?
食べ物クラスを下のように定義してみましょう。
食べ物クラス
- 属性
- おいしさ
- 振る舞い
- 空腹を満たす
そうです。
料理クラスの「おいしさ」という属性と「空腹を満たす」という振る舞いは、食べ物クラスから継承したものだったのです。
継承ツリー
このように、汎化と特化、スーパークラスとサブクラス、そして継承の関係は、上位から下位、そのまた下位、さらに下位というように、連綿と続くものなのです。そして、全てのモノの頂点にあるモノがあります。
それは「オブジェクト」というクラスです。
「物事」という名の概念なわけです。
ここで、ちょっと混乱するかもしれません。
ひとつひとつのモノ、インスタンスのことも「オブジェクト」と言っていました。
それとこれとは、別モノです。
物事と、「物事」という名の概念。
ここはゆっくり読んで、理解してください。
ここでの「オブジェクト」というのは、同じ名前ですがクラス名のことです。
逆に言えば、すべてのオブジェクトは、もとをただせば「オブジェクト」(物事)という概念から派生しているわけですから、ひとつひとつのものをオブジェクトと言ってもいいわけです。
最上位にはオブジェクトがあることはおわかりいただけたでしょうか?
では最下位には何があるのでしょうか?
もうこれ以上具体的にはできないという、完全に具体的なモノです。
たとえば、今あなたが作ったばかり(だと考えてください)の、そのカレー。
これ以上具体的なモノはありませんね。
要するに、現物(ゲンブツ)です。
現物というのは、世の中に無数にありますよね。
道ばたの石ころの一つからスペースシャトル エンデバー号まで、無数にあって、しかもこの世に2つとない具体的なモノです。
オブジェクト | ||||
├ | 乗り物 | |||
│ | └ | 宇宙船 | ||
│ | ├ | ロケット | ||
│ | └ | スペースシャトル | ||
│ | └ | エンデバー号 | ||
└ | 食べ物 | |||
├ | 健康食品 | |||
└ | 料理 | |||
├ | ハンバーグ | |||
└ | カレー | |||
└ | あなたのカレー |
図にすると、まるで木のような構造ですね。
ですので、これを継承ツリーと言うこともあります。
全てのモノは、継承ツリーのどこかに含まれるのです。
なんだか、北欧神話のユグドラシル(世界樹)を連想させますね。
日常の中の継承
継承は、まったく特別なものではなく、けっこういろいろなところで目にすることができます。たとえば、私たちが普段何気なく目にしているモノにも、わかりやすい継承はあります。
楽器クラスには、さまざまなサブクラスがありますね。
管楽器クラス、弦楽器クラス、打楽器クラス等。
楽器 + 管 = 管楽器
つまり、クダを持った楽器が管楽器なわけです。
楽器 + 弦 = 弦楽器
つまり、ゲンを持った楽器が弦楽器。
ものすごく見たまんまですね。
日本語というのは、このようにけっこうわかりやすく継承を表しているケースが多いんですね。
まさに名が体を表す言語なわけです。
ひょっとしたら、日本語がこうした優れた性質を持っているがゆえに、逆に私たちは、こういう論理的な思考を行う努力を怠っているのかもしれません。
改めて、身の回りのものを見直してみてください。
今あなたの目に留まったものは、必ず継承ツリーの末端に位置します。
なぜなら、それは具体的な物だからです。
そこで、ちょっと考えてみてください。
その物の背後には、どんなスーパークラスが存在するんでしょうね。
イマジネーションの世界を楽しんでください。
オススメ
開発者の方向けのオブジェクト指向入門には、オブジェクト脳のつくり方がオススメです。オブジェクト指向でソフトウェアを考えるためのコツがわかります。
基本的なことをひととおり、比較的楽に理解することができるでしょう。
0 件のコメント:
コメントを投稿