継承は何のためにあるか?

常々思ってることなんですが……オブジェクト指向プログラミング(OOP)って何?
オブジェクト指向言語xとyではどちらがより純粋か?とか,クラスベースvsインスタンスベースとか,Lispオブジェクト指向だ!とか.どれだけ抽象的な概念かも人によってさまざまで,一方ではプログラミングの哲学としてとらえてる人たちがいて,もう一方では単なる便利機能の詰め合わせだととらえている人たちがいるようです.

Daniel Pietraruさんはhttp://littletutorials.com/2008/06/23/inheritance-not-for-code-reuse/という記事で,よくある継承に関する誤解について書いています.彼は就職希望の大学卒業生の面接でOOP言語の特徴について尋ねるそうです.

Usually when I get to object oriented programming and I ask for characteristics of an OOP language, I get the text book mantra: encapsulation, inheritance and polymorphism - good. And then I ask what is the purpose of each of them.

彼らは教科書通りにカプセル化・継承・ポリモフィズムと答えるそうです.一方で,継承が何のためにあるのかを質問すると誰もが,コードの再利用のため.と答えるそうです.実際には全然違いますが.

実際には,継承は様々な抽象化のレベルでカテゴリー化された概念のヒエラルキーを作るためのものです.それによってポリモフィズムを助けるのだそうです.

Inheritance is a mechanism used to achieve categorization and to facilitate polymorphism. Using inheritance you can build a hierarchy of concepts separated in categories at different levels of abstraction. By doing this, you can efficiently use another OOP concept, polymorphism, which allows the same control code to manage all objects in a category even if they are different in their implementation.

つまり,コードの再利用という直接的なかたちでプログラミングに貢献するのではなく,IS-A関係の記述という一見プログラミング的には無価値に見える機能によって,ポリモフィズムを可能にする.ということでしょうか?

となると,カプセル化・継承・ポリモフィズムと3つ並べるのは変な感じがします.カプセル化ポリモフィズムでいいんじゃないでしょうか?カプセル化も取り立ててオブジェクト指向の特徴,というようなものでしょうか?ようはADTですよね?ポリモフィズムしか残りませんね……

ともかく,彼は継承によってコードの再利用が起こることはあるが,コードの再利用のために継承を用いるのは間違いだと指摘しています.

元記事はOOPだけでなく,誤解を広めた高等教育やソフトウェア危機についても言及したすばらしい記事です.読んでみることをオススメします.

2008/7/8 タイトルを継続と書いていたのを修正
2008/11/6 http://yichiban.blogspot.comから移動