Java は複数のクラスからの継承を許可していません (それでも、複数のインターフェースからの継承は許可されています)。私はそれが古典的なひし形の問題と非常に一致していることを知っています。しかし、私の質問は、複数の基本クラスから継承する際にあいまいさがない (したがってダイヤモンドの問題の可能性がない) 場合に、Java が C++ のような多重継承を許可しないのはなぜですか?
8 に答える
それはJavaの設計上の決定でした。あなたは決してそれを手に入れることはないので、あまり心配しないでください. MI は Mixin を作成するのに役立つかもしれませんが、それが唯一の良い MI です。
ほとんどのプログラマーが多重継承を適切な方法で使用していないことを読んだことがあります。「コードを再利用するためだけにクラスから継承してください」は、多重継承の場合のベストプラクティスではありません。
多くのプログラマーは、ほとんどの場合、単純な継承をいつ使用するかを知りません。多重継承は注意して使用する必要があり、適切な設計が必要な場合に何を行っているかを理解している必要があります。
Java (c++ のように) に多重継承がないことが、コード/アプリケーション設計/問題ドメインのクラスへのマッピングに制限を課すとは思いません。
Javaが多重継承をサポートしている場合、Javaの他の機能に影響を与える可能性があります。
スーパークラスコンストラクターを呼び出すために使用されるsuper()メソッドを検討してください。プログラムに複数のスーパークラスがある場合(多重継承のため)、コンパイラーはどのスーパークラスコンストラクターが必要かについて混乱します呼び出されてエラーをスローする
シンプルさ。Tom Sintesの言葉を引用すると、
Java 設計チームは、Java を次のように作成しようと努力しました。
- シンプル、オブジェクト指向、使い慣れた
- 堅牢で安全
- アーキテクチャ ニュートラルでポータブル
- ハイパフォーマンス
- 解釈され、スレッド化され、動的
Java 言語から多重継承を省略する理由のほとんどは、「単純で、オブジェクト指向で、親しみやすい」という目標に由来します。単純な言語として、Java の作成者は、ほとんどの開発者が広範なトレーニングを受けなくても理解できる言語を望んでいました。そのために、彼らは C++ の不必要な複雑さ (単純さ) を持ち越すことなく、可能な限り C++ に似た (親しみやすい) 言語にするように努めました。
設計者の意見では、多重継承は解決するよりも多くの問題と混乱を引き起こします。そのため、言語から多重継承をカットしました (演算子のオーバーロードをカットしたのと同じように)。設計者は C++ の豊富な経験から、多重継承は頭を悩ます価値がないことを学びました。
Java 設計者はそう判断しました。多重継承は、インターフェイスを使用してシミュレートできます。
Javaが実装の多重継承をサポートするために使用しなかったことは事実です(タイプ、つまりインターフェースのみ)。それは設計上の決定でした。
ただし、Java 8 以降では、デフォルト メソッドを使用した多重継承がサポートされています。http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.htmlを参照してください:
実装の多重継承は、複数のクラスからメソッド定義を継承する機能です。このタイプの多重継承では、名前の競合やあいまいさなどの問題が発生します。... デフォルトのメソッドは、実装の多重継承の 1 つの形式を導入します。
簡単な答えの 1 つは、Java のすべてのクラスは java.lang.Object IIRC から派生しているということです。したがって、常にダイヤモンドの問題が発生します... :-D
ひし形の問題は、複数の親クラスが何かの独自の実装を定義し、これら 2 つの子クラスがどの実装を使用するかというあいまいさに対処しなければならない場合に発生します。では、Java のすべてのクラスが Object から派生しているとしたら、それは単一の親クラスです。「単一の親、複数の派生クラス」は「複数の親、単一の派生クラス」と同じではありません