JavaRush /Java Blog /Random-JA /コーヒーブレイク#95。Javaの多重継承問題を解決する方法

コーヒーブレイク#95。Javaの多重継承問題を解決する方法

Random-JA グループに公開済み
出典: FreeCodeCamp Java は、現在使用されている最も人気のあるオブジェクト指向プログラミング言語の 1 つです。プラットフォームに依存しないため、あらゆるタイプのデバイスおよびあらゆるオペレーティング システムで Java アプリケーションを見つけることができます。Java は比較的習得が簡単なため、多くのプログラマーが習得する言語の 1 つです。知っておくべき Java の重要な機能は、クラスの継承です。継承によりコードを最適化できるため、クラスの再利用が容易になります。すでにテストおよびデバッグされたコードを再利用できると、ソフトウェア開発ライフサイクルが短縮され、コストが削減されます。 コーヒーブレイク#95。 Java の多重継承問題を解決する方法 - 1理論的には単純な概念ですが、継承関係のコーディングには詳細な注意が必要です。特に多重継承に関しては、1 つの子クラスが複数の親クラスからプロパティを継承します。Java では、多重継承関係があいまいになるため拒否しますが、やるべきことがわかっていれば、同じ効果の多くを実現する方法がいくつかあります。この記事では、多重継承の問題を検討し、Java での代替コーディング オプションについて説明します。

継承に関する用語

場合によっては、プログラマーとして成功するには、一般的なエラーや問題の回避策を見つける問題解決者になる必要があります。これは安全でスマートなコーディングに不可欠な部分です。そのような問題の 1 つは、Java の多重継承 (またはむしろその欠如) に関連しています。 コーヒーブレイク#95。 Java の多重継承問題を解決する方法 - 2Java の継承を完全に理解するには、オブジェクト指向プログラミング (OOP) の基本的な継承用語に精通している必要があります。
  • クラスは、オブジェクト指向プログラミング言語の基本的なパターン構造です。クラスは、オブジェクトのグループに共通のプロパティを定義します。
  • 親クラス: 基本クラスまたはスーパークラスとも呼ばれます。親クラスは、子クラスに機能を提供する拡張可能なクラスです。再利用が可能になります。親クラスの定義と関数は、子クラスの作成時に再利用されます。
  • 子クラス: より一般的にはサブクラスと呼ばれ、子クラスは別のクラスから機能を継承します。子クラスは拡張クラスまたは派生クラスです。
  • 継承: 親クラスと子クラス間の関係。

OOP 継承タイプ

Java、C++、JavaScript、Python、PHP、Ruby、Perl など、現在多くの人気のあるオブジェクト指向プログラミング言語が使用されています。継承はこれらの OOP 言語間で共通の概念ですが、これらの各言語にすべてのタイプの継承が存在するわけではありません。一般的な継承の種類と、使用している特定の言語における継承の制限を理解しておくことは非常に重要です。継承について知れば知るほど、より有能な開発者になれるでしょう。Java でサポートされる継承のタイプには次のものがあります。
  • 単一レベルの継承: 子クラスが単一の親クラスから機能を継承する場合。
  • マルチレベル継承: これは、単一レベル継承のマルチレベル形式です。マルチレベル継承では、子クラスは他の子クラスの親クラスとしても機能します。各レベル間の関係は線形であり、多重継承より上位に進む分岐はありません。この場合、最後の子クラスには、上のすべてのレベルの関数が含まれます。
  • 階層継承: 多重継承の逆。階層継承では、1 つの親クラスに複数の子クラスがあります。したがって、上に分岐するのではなく、下に分岐します。
  • ハイブリッド継承: 名前が示すように、ハイブリッド継承は他のタイプの継承を組み合わせたものです。
上記の継承タイプに加えて、Java がサポートしないタイプもあります。
  • 多重継承: 多重継承では、子クラスに複数の親クラスがあります。Java と JavaScript は多重継承をサポートしていませんが、C++ などの OOP 言語は多重継承をサポートしています。
  • マルチパス継承: 複数、マルチレベル、および階層継承のハイブリッド。マルチパス継承では、子クラスは親クラスおよび親クラスのいくつかの子クラスからその特性と機能を継承します。マルチパス継承は多重継承に基づいているため、Java はその使用をサポートしていません。

Java が多重継承をサポートしない理由

多重継承の主な問題は、子クラスに曖昧さが生じる可能性があることです。1995 年のホワイトペーパーの中で、主任 Java 設計者の James Gosling は、多重継承の問題が Java が作成された理由の 1 つであると述べました。多重継承に固有の複雑さは、ダイヤモンドの問題で最もよくわかります。ダイヤモンド問題では、親クラス A には 2 つの異なる子クラス B と C があります。つまり、子クラス B と C はクラス A を拡張します。 コーヒーブレイク#95。 Java の多重継承問題を解決する方法 - 3次に、クラス B とクラス C の両方を拡張する新しい子クラス D を作成します。多重継承 (D は B と C を拡張)、階層継承 (B と C は拡張) があることに注意してください。 A) およびマルチレベル継承 (D は A、B、C を拡張します)。ダイヤモンド問題では、子クラス B と C は親クラス A からメソッドを継承します。B と C は両方とも継承されたメソッドをオーバーライドします。しかし、B と C の新しい方法は互いに矛盾します。最後の子クラス D は、その複数の親 B および C から 2 つの独立した競合するメソッドを継承します。クラス D のどのメソッドを使用するかが明確ではないため、あいまいさが生じます。他の OOP プログラミング言語は、多重継承の曖昧さを解決するためのさまざまな方法を実装しています。

Javaの多重継承問題を解決する方法

多重継承に問題があるからといって、多重継承が役に立たないというわけではありません。1 つのクラスに他の複数のクラスの関数を持たせたい状況は数多くあります。ソフトウェア開発者として非常に成功したときに購入する Tesla Roadster について考えてみましょう。その技術的特徴は、スポーツカークラスと電気自動車クラスの両方に基づいています。別の例: この記事を読んでいるブラウザ。これには、インターネット プライバシー ソリューション クラスと一般的なインターネット ブラウザ クラスの機能が含まれています。ただし、Java では複数のクラスを拡張できません。では、この言語は多重継承の問題にどのように対処するのでしょうか? Java はインターフェースと呼ばれる構造を使用します。インターフェイスは、クラスによって実装される動作を定義する抽象型です。インターフェイスは抽象的なため、その動作に関する詳細な指示は含まれていません。代わりに、クラスはインターフェイスの動作の具体的な実装を提供します。インターフェイスには、いくつかの定義的な特徴があります。
  • クラスとは異なり、インターフェイスはインスタンス化されません。代わりに、クラスはインターフェイスを実装します。
  • インターフェイスにはパブリック定数定義とメソッド ヘッダーのみが含まれます。
  • インターフェイスは他のインターフェイスのみを拡張でき、クラスは拡張できません。
  • インターフェイスは複数のインターフェイスを拡張でき、クラスは複数のインターフェイスを実装できます。
インターフェイスを使用してダイヤモンドの問題を効果的に回避できるようになりました。インターフェイスのみが他のインターフェイスのみを拡張できること、および複数の継承特性を必要とするクラスは複数のインターフェイスを実装する必要があることを思い出して、ダイヤモンド問題クラスをオーバーライドできます。以前はクラス A、B、および C であったものは、インターフェイス A、B、および C になりました。インターフェイス B と C は依然としてインターフェイス A を拡張していますが、これらのインターフェイスには特定の機能はなく、特定の動作のみがあります。クラス D は、インターフェイス B および C にある動作を具体的に実装する役割を担うクラスのままです。重要な違いが 1 つあることに注意してください。クラス D はインターフェイス B および C を拡張しません。代わりに、それらを実装します。この方法では、実際には多重継承は発生しません。代わりに、単に問題を再構成しただけです。

結論

継承を理解することは、有能な Java 開発者にとって不可欠です。継承の制限と、従来の多重継承の問題に対する Java に組み込まれた回避策を知ることも同様に重要です。Java で多重継承の効果を再現するインターフェースを作成する方法を学ぶと、生産性と雇用の機会が向上します。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION