##結論
結論から言うと抽象クラスの一番の目的=本質は、文字通り抽象化です。
確かに、多重継承できるとか・・できないとか、インスタンス化できるとか・・できないとか、その特徴を列挙する記事を多く見かけますが、それはすべて表面上のことで、本当の目的=本質を表してはいません。
では、抽象化とは何か、なぜこのようなクラスが必要なのかを考察します。
##抽象化とは
現実世界は非常に複雑な要素が絡み合ったカオスな世界です。
その世界をコンピュータの世界へ投影することをモデル化といいますが、カオスのままでは投影できません。
そこで、不要な要素を取り除いて、必要な要素だけに光を当てることで理解しやすくする・・・
この行為こそ、まさに抽象化の意味そのものになります。
抽象化することで、その世界の本質や非効率な部分、不足している箇所=改善が必要な個所が見えてきます。
また、抽象化することで、目的の異なった複数の視点で実世界を切り取ることができるので、設計者と実装者のように目的に合った視点で物事を分離できます。
##分業
また、抽象化にもレベルがあり、物理モデル的なオブジェクト図と、それをさらに抽象化した論理モデル的なクラス図のように相対的に具体的なレベルのものと抽象的なレベルがあります。
システム開発では業務要件のような実世界に近いカオスな世界とコンピュータの秩序ある世界をなるべく隔離することが求められます。
プログラムソース全体にカオスな業務ルールがちりばめられると、変化が激しい業務ルールに翻弄されてシステムが破綻してしまいます。
そこで、業務レベルの要件を抽象クラスで受け持ち、コンピュータの実装部分をインプリメント(実装)クラスで分離します。
このことで、業務のモデル化と実装工程を分業できることも意味します。
##部品化
また、複雑な部分を分離することで、実装クラスをシンプルにでき、部品化しやすくなります。
部品化が進めば、業務が変わっても部品の入れ替えだけで済むため、開発効率が向上します。
interface以外の多重継承を制限しているのも、実装部分が複雑になることを防ぎ、部品化しやすくするためのものです。
ただし、オブジェクト指向での抽象化はinterfaceやクラス、継承など様々な場面で利用できますが、使い方によっては一番重要な部品化と分業を妨げる副作用も持っています。
そのような状況が蔓延してきたため、後付けで、多重継承の制限を設けたのではないかと推測できます。
このように、オブジェクト指向の本来の目的である、分業と部品化をこの抽象クラスでも一役買っていることこそ、その本質にほかなりません。
##最後に
その意味をしっかり心して、単に多重継承できるとか・・できないとか、インスタンス化できるとか・・できないとか、表面的なことにとらわれて副作用を招かないよう、分業と部品化のためにどう使うべきかを本質的に考えて使ってほしいと考えます。