オブジェクト指向って継承による多態があるからこそなんだけど、継承が非推奨になって以降に雰囲気でオブジェクト指向を知った人には、継承はオプションでカプセル化だけでオブジェクト指向って言ってしまいがちに思います。 実際はカプセル化はオブジェクト指向固有じゃなくて、クラスでカプセル化を実現してるだけです。
さまざまな人のオブジェクト指向の定義
本来ならどのように継承こそがオブジェクト指向なのかという説明をするんですが、かなり長くなりそうなので、とりあえずはいろいろな人たちのオブジェクト指向の定義を抜き出してみます。
「ここに挙がってるのはオブジェクト指向の一派にすぎない」というような意見もありますが他の派閥についてまとまって定義され共通認識になっているようなものは見当たらないので、プログラミングの指針には なりづらいと思います。
ストラウストラップ
C++を産んだストラウストラップは「C++の設計と進化」で次のように言ってます。ここでデータ抽象化というのはカプセル化だと考えて問題ないと思います。
オブジェクト指向プログラミングは継承を使うプログラミングだ。データ抽象化はユーザ定義タイプを使うプログラミングだ。ほとんど例外なく、オブジェクト指向プログラミングはデータ抽象化のスーパーセットだ
ランボー
オブジェクト指向方法論OMTを開発したランボーは次のように書いてます。ここでアイデンティティまで含めているのが面白いところです。値型との区別ですね。
オブジェクト指向的アプローチに要求される特徴が正確に何か、ということに関してはいくつかの議論があるが、それらの議論は普通以下の4つの面を含んでいる。すなわち、アイデンティティ、分類、多相性、そして継承である
ブーチ
ブーチ法のブーチは、次のように書いています。
もし言語が継承を直接サポートしないならば、それはオブジェクト指向とはいえない
メイヤー
「オブジェクト指向入門」を書いたメイヤーは、次のようなオブジェクト指向の原則を書いています。一言で継承が重要とは書いていませんが、著書全体を通して継承の使い方を解説しています。
方法論と言語には、中心的な概念としてクラスの概念が必須である
すべての型はクラスに基づいていなければならない
ほかのクラスを継承するクラスを定義できなければならない
ヴァン・ロイ、ハリディ
ガウディ本として知られる「コンピュータプログラミングの概念・技法・モデル」には次のような記述があります。
ガウディ本はオブジェクト指向だけではなくプログラミングのさまざまなモデルや概念をまとめて紹介した本で、他の手法との対比をよりはっきりと行っています。
「オブジェクト指向プログラミングとは、オブジェクト、データ抽象、明示的状態、多態性、および継承を使うプログラミングである」
「 他の計算モデルと比較すると、多態性と継承を使うことが主たる特徴である」
また、ガウディ本には次のような記述があります。高階プログラミング技法というのは関数型と考えるといいです。
「オブジェクト指向言語ではできるだけ明示的状態と継承を使用することが推奨される。」「このことは一見、単純で直観的であるが、実際はプログラミングを複雑にする」「好ましいプログラミング技法を記述するための共通用語を定義するデザインパターンは普通、継承を使って説明される。多くの場合、より簡単な高階プログラミング技法で十分であろう」
次のように、特別な場合以外はオブジェクト指向のアプローチを避けたほうがいいということも書いています。
「オブジェクト指向に頼るのは、プログラム構造が著しく簡単になる場合に限ることを奨める。プログラムに、密接に関連するデータ抽象の集合があって、明らかに継承の必要があるような場合がその一例である。そうでなければ、もっと簡単なプログラミング技法を使用することを奨める。」
2004年時点では まだオブジェクト指向の熱気が残っていたので、このくらいの控えめな記述になったのかなという感じがします。