継承にかかわる諸問題

「継承」はオブジェクト指向ではよく話題になり、また問題視されます。しかしそれは使い方が間違っているからです。

継承の種類

単刀直入に始めましょう。継承には3種類あります。そしてそれは「オブジェ クト指向」の話で出した「オブジェクトの3つの意味」に対応します。それを 順に見ていきましょう。ここでもまた犬の例を使うことにしましょう。

内包の継承

内包とは「犬とは何か」でした。そして内包の継承とは、「犬」という概念を 受け継いで、それより狭い概念を導出することにあります。例えば「秋田犬」 というオブジェクトを作ることにあたります。

「犬とは何か」という問いの答えは「食肉目イヌ科の哺乳類でオオカミを家畜 化した動物」でした。そして「秋田犬とは何か」という問いの答えは、「食肉 目イヌ科の哺乳類でオオカミを家畜化した動物であり、秋田原産で大型、尾は 太く番犬に適した動物」です。前半部分は「犬」の定義そのままです。だから 「継承」なのです。

内包の継承は一番なじみがあるもので、直感的にわかりやすいものでしょう。 要するに「秋田犬」は「犬」の一部です。 内包の継承は「is-aの関係」とも呼ばれます。日本語で書けば「秋田犬は犬で ある」の関係です。

外延の継承

外延とは「どれが犬か」あるいは「犬であるものの集合」でした。外延の継承 とは「犬であるものの集合のうち、ある条件に当てはまるものを抜き出した集 合」です。例えば「飼犬」というのは「犬」の一部です。そしてそれは「犬の うち、役場に飼犬として登録されたもの」です。

さあ、内包と外延の違いが理解できていますか?上の定義からすると、「飼犬」 というのは外延です。「これは飼犬ですか?」という問いに、はっきりYesまた はNoと答えることができます。それに対して「これは秋田犬ですか?」という 問いには明確に答えることのできないハーフの犬や雑種に近い犬がいるかもし れません。

それに定義文を見てください。「飼犬とは役場に飼犬として登録された犬であ る」という文は、定義としては完璧ですがどこか変です。本来は、人は役場に 登録された犬を飼犬と呼ぶのではなく、飼犬だから役場に登録するのです。

「飼犬」の定義として「飼犬とは人が飼育している犬のことである」という (内包による)文章もありえます。しかしこの定義だと、野良犬に誰かが餌をやっ ているというようなグレーゾーンがあります。それに対して「役場で登録され ている」という文章にはグレーゾーンはありません。しかし、これは「これは 飼犬ですか?」という問いには正確に答えられますが、「要するに飼犬って何?」 という問いには答えられません。

内包と外延はどちらがいい悪いという問題ではありません。その言葉をどうい う意味で使いたいかという問題だけです。ただ、このように違いがあるという ことを認識して下さい。そして、内包の継承と外延の継承は正確には一致しま せん。

機能の継承

機能とは「犬にどんなことができるか」でした。機能の継承とは、「普通の犬 にはできないような特殊な機能が追加された犬」のことです。例えば「盲導犬」 は普通の犬にはできない「盲人の先導をする機能」が備わっています。これが 機能の継承です。

これは内包の継承と間違いやすいので気をつけてください。内包の継承とは違 い、機能の継承ではもとの定義を一部否定するような記述があります。例えば 「犬は人を見るとワンワンと吠える」けれども「盲導犬は人を見ても吠えない」 というようにです。

もちろん「『犬は人を見るとワンワンと吠える』という文は間違っている。吠 えない犬だってたくさんいる」という意見はその通りです。しかしこの意見は 的外れです。なぜならこの文は内包について述べたものだからです。内包は正 確な定義ではなく、世間一般の人が犬に対して持っているイメージのことです から。「犬って何ですか?」と聞かれた時にとっさに「ほら、ワンワン吠える あれだよ」と説明しませんか?これが内包です。これは正確な定義ではなく、 犬というものの一般的なイメージにすぎないのです。

もっと極端な例を出しましょう。もしマッドサイエンティストが生体改造を行っ て、犬に翼をつけて空を飛べるようにし、人間の言葉をしゃべる「スーパー犬」 をつくったとしましょう。これは「犬」に対する機能の継承です。しかしこれ は本当に犬でしょうか?

普通の犬が持たない特殊な機能をつける機能の継承は、やりすぎると元の「犬」 という概念から遠く離れた概念に変化してしまいがちです。これが機能の継承 が持つ問題点です。

継承の種類を区別せよ

クラスに3つの意味があるように、継承にも内包の継承と外延の継承、機能の 継承の3種類があります。そしてほとんどの場合、この違いを意識せずに混同 して使ってしまっています。これが問題なのです。

内包の継承は「is-a継承」あるいは単に「継承」と、外延の継承は「インター フェース継承」あるいは「型継承」と、機能の継承は「プロトタイプ継承」と 呼ばれることもあります。そして、内包の継承(is-a継承)が意味的には一番自 然な継承です。オブジェクトの本質が内包にある以上、継承も内包の継承だけ を使うべきです。