質問: Javaではクラスの多重継承が禁止されています。 これは、多重継承によって、親クラスのメソッド同士が競合するのを避けるため。と習いました。 が、それならば多重継承によって競合したメソッドのオーバーライドを強制すれば済む話だと思うのですが、それではいけないのでしょうか? 多重継承が禁止されている理由について、上記以外の物があれば、教えてください。
回答: よそのQ&Aサイトへ行った回答ですが、同じ趣旨の質問への回答のため転記しておきます: 言語設計時の選択として、単純さ(Simple)を選んだ結果でしょう。Javaの生みの親 James Gosling氏による、1995年発行のWhitePaper "Java: an Overview" より引用します。 > > **Simple** > > JAVA omits many rarely used, poorly understood, confusing features of C++ that in our experience bring more grief than benefit. This primarily consists of operator overloading (although it does have method overloading), multiple inheritance, and extensive automatic coercions. > > > 多重継承(multiple inheritance)が意味する範囲は広く、「状態(state)の多重継承」、「実装(implementation)の多重継承」、「型(type)の多重継承」に分類できます。公式The Java Tutorials, Multiple Inheritance of State, Implementation, and Type でも言及されている通り: * 状態(state)の多重継承:言語仕様上の選択としてサポートしない * 実装(implementation)の多重継承:Java8で導入されたデフォルトメソッド(default method)でサポート * 型(type)の多重継承:インターフェイス(interface)継承でサポート 同WhitePaperで言及されるC++言語の場合、既定動作では「状態(state)の多重継承」により親クラスの状態が複数存在する振る舞いになります。これを回避する機構として仮想継承(virtual inheritance)という言語機能をオプション提供しますが、比較的複雑で難解な機能です。C++ではプログラマに選択の自由度を与えますが、複雑で理解を難しくしているのも事実です。 ``` // C++言語における「状態(state)の多重継承」 class B { int m1; }; // クラスD1,D2ともにクラスBを継承 class D1 : public B { ... }; class D2 : public B { ... }; // D1,D2を多重継承したクラスXのインスタンスには // 親クラスBのインスタンスが 2 つ含まれる。 // つまりm1変数という「状態」が2つ同時に存在する。 class X : public D1, D2 {}; ``` Java言語では、プログラマにこのような難しい選択をさせないという思想になっています。