(HASHIMOTO SOFTWARE CONSULTING)トップ
技術コラム
第2回:継承②〜科学的に継承を理解する準備-PART2
第1回に引き続き、今回(第2回)も継承を科学的に理解するための準備の解説をします。
今回も継承の意味、価値、奥の深さを考える準備として、継承にどのような効果があるのか、代表的な専門家の意見を取り上げ見ていきましょう。
「実装継承」と「多重継承」の効果
【表2-1】の内容は巷の書籍やセミナー、トレーニングの継承の解説で良く見かけます。しかし継承の
解説が少々単純すぎています。もっと言えは、【表2-1】の説明は間違いではないものの適切とも言えないガイドラインです。
まだ継承になれていない方には良いかも知れません。
最も基本的となる継承に「タイプ(型)継承(type inheritance)」という種類があります。この継承と対をなすのが
「実装継承(implementation inheritance)」です。
別の継承の分類として「単一継承(single inheritance)」と「多重継承(multiple inheritance)」があります。
なお、本コラムをご覧なる方が、まだ「タイプ(型)継承(type inheritance)」「実装継承(implementation inheritance)」「単一継承(single inheritance)」「多重継承(multiple inheritance)」
についてご存知ない場合は、分かる範囲で読み進めて頂ければ結構です。第3回以降で科学的に継承を説明していく中で「タイプ(型)継承(type inheritance)」「実装継承(implementation inheritance)」
「単一継承(single inheritance)」「多重継承(multiple inheritance)」を解説します。
さて、「多重継承(multiple inheritance)」や「実装継承(implementation inheritance)」は、多くの場合あまり好ましく考えられていないようです。
時には強く「多重継承」や「実装継承」を戒めている書籍やセミナー、トレーニングもあるようで、「多重継承」や「実装継承」は悪役の感じすら受けます。
C++やEiffelには「多重継承(multiple inheritance)」のメカニズムがサポートされていますが、Javaを
はじめ多くのオブジェクト指向言語では「多重継承(multiple inheritance)」がサポートされていないことからも「多重継承(multiple inheritance)」があまり積極的に利用されない傾向にあることが分かりま
す。これは言語設計やコンパイラー作成が複雑になるという理由もありますが、最も大きな理由は言語設計時の「多重継承(multiple inheritance)」に対する重要性を反映したものでしょう。
一方、オブジェクト指向技術やプログラム言語の専門家達は、「多重継承」や「実装継承」をどのように捉えているのでしょうか?
実は専門家の中には「多重継承」や「実装継承」が、有用かつ重要と考えている人は多く存在します。第1回の「開放閉鎖原理(Open-Close Principle)」の紹介で登場したBertrandMeyerは「多重継承」や
「実装継承」を極めて有用と考えている専門家です。
Bertrand Meyerは彼の書著(文献[2-3])の中で、彼独自の視点で「継承のテクニック」の分類を掲載しています(文献[2-3]の第24章)。
この分類の中で、継承を3つの大きなグループに分け、さらに12個に分類し継承の使い方を特定していています。Bertrand Meyerは12個の継承の分類が全て有用と考えています(【表2-2】)。この12個の分
類の中に「多重継承」や「実装継承」が含まれています。
ただし、この12個に分類された継承を理解するには、【表2-4】の内容を理解しなければなりません。また、Bertrand Meyerの分類は、彼が設計したオブジェクト指向言語Eiffelの機能を利用したときに可
能な継承の分類になっています。オブジェクト指向言語Eiffelのメカニズムは、特性(Eiffelではフィ-チャー(feature)と呼ぶ)ごとに細かな継承の設定が可能になる機能を持っています。
そのため、JavaやC++や他のオブジェクト指向では直接実現することが困難な継承もあります。
Bertrand Meyerは文献[2-2] [1-3]の中で「多重継承」を持つことをオブジェクト指向言語の定義に含
めており、「多重継承」が極めて自然な継承である事を述べています。
Peter Wegnerも文献[2-5]において「実装継承」に実用的な価値があると考えていることを述べている専門家です。
Gilad BrachaとWilliam Cookは文献[2-4]の中で「実装継承」の技法であるミックスイン[注1-3]につ
いて「異なる複数のクラスから抽象的でないルーチンの集合を継承して新しい複雑なクラスを構築する能力がある」と有効性を述べています
「多重継承」と「実装継承」は専門家達が指摘しているように多くのメリットがあります。専門家達は
「継承の種類」と「利用目的」を明確にして議論しています。一方、巷の書籍やセミナーでは漠然とした
議論で「多重継承」と「実装継承」を否定しているようです。
「多重継承」が否定される理由の1つに、C++のケースがあるようです。C++は広く利用されているプ
ログラム言語の中において数少ない「多重継承」をサポートしている言語です。C++で「多重継承」を利
用するときには、気にしなければならない代表的な事項に下記があります。
- 特性(プロパティ)の衝突
- ダイヤモンド継承(菱形継承)
- 仮想基底クラス
「多重継承」の特徴や有効性の是非を議論する時に、「C++の仕様の継承メカニズムの都合」と「ミキ
シン」に代表される「コードの再利用」の継承を考慮にいれない表面的な議論に感じます。
既に述べた様に、多態(ポリモフィズム/多相)が成立するケースの継承を扱うことだけが、継承の利用
方法ではありません。「多重継承」をさけて「単一継承」だけ利用しても、多態(ポリモフィズム/多相)
が成立する継承階層の作成は困難であることが専門家の間では常識となっています。実は「多態(ポリモフ
ィズム/多相)が成立する」ということが、かなり限定されたケースだからです
詳細な理由は「振る舞いタイプ(型)置換原理」の時に解説したいと思いますが、「実装継承」や「ミキ
シン」のような継承の利用をしなければ、継承のもつ可能性やメリットをかなり限定することになるのです。
【表2-3】で「実装継承」と「ミキシン」について記述したように、「差分プログラム」はオブジェク
ト指向の基本目的の1つです。継承階層が深くなる事と差分プログラムは比例します。当然、色々なクラ
スから機能を継承することでコードを再利用するために、継承階層は網の目状になります。実世界を見て
も「多重継承」と「多重継承」によって「ダイヤモンド継承」になることは極めて自然です。
継承階層が網の目状になったとき、常に多態(ポリモフィズム/多相)が成立するような継承階層は、そもそも困難です。
C++と同じく「多重継承」をサポートするEiffelの言語設計者Bertrand Meyerは、「ダイヤモンド継
承」を否定しません。Eiffelには予め「ダイヤモンド継承」への考慮と「多重継承」に対してさまざまな優
れたメカニズムが提供されているのも理由の1つですが、「多重継承」にとって「ダイヤモンド継承」を
避けていたら、事実上「多重継承」を使うなというくらい「多重継承」の活用の機会は激減します。「実
装継承」や「ミキシン」のような継承の利用をもう少し検討することは大切です。
C++はC言語との互換性の問題と、「多重継承」が後から追加された理由により扱いづらい部分がある
のは確かです。しかし、だからと言ってC++で「多重継承」の利用を否定することに違和感があります。
C++の「多重継承」を利用する技法が色々紹介されている書籍も多くあります(例えば、[文献2-6][文献2-7] [文献2-8])。
『科学的モデリング』で継承を正確に理解する
『科学的モデリング』の視点で継承を正確に理解し、効果的に利用するには、いくつかの重要な理論や
定理等を学習する事が必要です。
本コラムでは、今後下記の重要事項を紹介しながら継承を解説していく予定です。
参考文献
文献[2-1] [Ian Joyner 1999]Objects Unencapsulated: Java、Eiffel and C++??(邦訳「オブジェクト指向言語のはなし」)
文献[2-2] [Bertrand Meyer 1988] Object-Oriented Software Construction(邦訳「オブジェクト指向入門」)
文献[2-3] [Bertrand Meyer 1997] Object-Oriented Software Construction(邦訳「オブジェクト指向入門 第2版-原則・コンセプト」「オブジェクト指向入門 第2版-方法論・実践」)
文献[2-4] [Gilad Bracha and William Cook] Mixin-basedInheritance
文献[2-5] [Peter Wegner 1991]Concepts and Paradigms of Object-Oriented Programming
文献[2-6] [Erich Gamma、その他 1994]Design Patterns: Elements of Reusable Object-Oriented Software (邦訳「オブジェクト指向における再利用のためのデザインパターン」)
文献[2-7][Robert C. Martin]Agile Software Development、 Principles、 Patterns、and Practices(邦訳「アジャイルソフトウェア開発の奥義 第2版」)
文献[2-8] [John Vlissides] Pattern Hatching: Design Patterns Applied ( 邦訳「パターンハッチング-実践デザインパターン」)