私はスーパークラスと別のクラスの計画された旅をしたいクラスの旅を持っています。計画されたjourneyクラスは、フォームが含まれているためJFrameを拡張します。ただし、このクラスもJourneyを拡張する必要があります。
これを行うための可能な方法はありますか?
私はスーパークラスと別のクラスの計画された旅をしたいクラスの旅を持っています。計画されたjourneyクラスは、フォームが含まれているためJFrameを拡張します。ただし、このクラスもJourneyを拡張する必要があります。
これを行うための可能な方法はありますか?
モデルとビューを混在させないでください。両方のドメインを明確に分離しておけば、多重継承は必要ありません(今回)。
旅のモデルクラスが1つと、そのような旅のビューアがあります。ビューアはサブクラス化して、ウィンドウ(インスタンス)Component
の(どこかに)表示する必要があります。JFrame
このビューアは、1つのジャーニーオブジェクトを取得し、ジャーニーのプロパティを表示します。Journey
旅に関するすべての情報を持っているのは一人で、視聴者だけが旅をユーザーに提示する方法を知っています。
public class PlannedJourney extends JPanel {
private Journey journey;
public JourneyViewer(Journey journey) {
this.journey = journey;
// build this panel based on the journey object
// (add labels, subpanels, widgets, ...)
}
}
これで、PlannedJourneyのインスタンスを作成し、それをアプリケーションJFrame
の適切な位置に追加できます。
Javaには多重継承はありません。言語では許可されていません。代わりにインターフェイスを使用するようにデザインを変更できるかどうかを確認してください。(ほとんどの場合可能です)。
いいえ、これはJavaでは不可能です。通常、同様の効果はインターフェイスを使用して実現できます(ここでは、Journeyがインターフェイスである可能性があります)が、メソッドの実装を継承する場合は、設計を再考する必要があります。
あなたの説明からの私の最も良い推測は、クラスをデータモデルを表す1つの階層と、データを表示するためにJFrameを拡張する別の階層に分けることができるということです。
SunJavaチュートリアルの継承ページから
定義:別のクラスから派生したクラスは、サブクラス(派生クラス、拡張クラス、または子クラス)と呼ばれます。サブクラスの派生元のクラスは、スーパークラス(基本クラスまたは親クラスでもあります)と呼ばれます。
スーパークラスを持たないObjectを除いて、すべてのクラスには1つだけの直接スーパークラス(単一継承)があります。他の明示的なスーパークラスがない場合、すべてのクラスは暗黙的にObjectのサブクラスになります。
クラスは、クラスから派生したクラスなどから派生したクラスから派生したり、最終的に最上位のクラスであるObjectから派生したりすることができます。このようなクラスは、オブジェクトに戻る継承チェーン内のすべてのクラスの子孫であると言われます。
Journey
拡張するか、インターフェースJFrame
を作成します。Journey
オブジェクト構造に最も適したオプションを選択してください。
Journey
延長することが理にかなっている場合は、それをJFrame
行います。このように、をPlannedJourney
拡張すると、から行うJourney
すべてのことも継承します。Journey
JFrame
これが意味をなさない場合はJourney
、インターフェースを作成し、をPlannedJourney
実装してJourney
ください。 PlannedJourney
からコードを継承することはできませんがJourney
、メソッドシグネチャを継承し、オブジェクトをJourney
に加えてとして渡すことはできますJFrame
。
Swingを使用しているときは、モデルをビューから分離していることを確認してください。データは1セットのオブジェクト(Model)に保存する必要があり、そのデータを表示するSwingコンポーネントは別のオブジェクトセット(View)である必要があります。これは、データ関数をカプセル化し、それらをGUIオブジェクトから分離し、モデル上のビューの一方向の依存を強制するのに役立ちます。オブジェクトはおそらく表示する必要があると考えてください。このように、はそれを表示するだけで処理でき、独自の階層を持つことができるへの参照のみを拡張して運ぶことができます。Journey
JourneyFrame
JourneyFrame
JFrame
Journey
いいえ。Javaには多重継承はありません。これは意図的な設計上の決定でした。
代わりに、スーパークラスの1つをインターフェースとして表現する方法を見つけることができれば、これで問題が解決する可能性があります。
PlannedJourneyにJourneyを拡張させてから、PlannedJourneyにJFrameのインスタンスを持たせるのがより良い方法だと思います。見方によっては一石二鳥のように見えます。
Javaでの多重継承は不可能です。
インターフェイスの複数の実装が可能です。これは、Javaでの多重継承に最も近いものです。
可能であれば、継承よりも構成を優先します。効果的なJavaから引用。
Joshua Blochの「EffectiveJava」をまだ読んでいない場合は、今がその時です。特に「継承よりも構成を優先する」のセクション。Javaでは複数の継承を行うことができないため、ほとんどの場合、JFrame拡張機能にUIであるPlannedJourneyへの参照を含めることが正しいアプローチである理由を説明します。
何が必要かは正確にはわかりませんが、Javaでは多重継承が非常に可能で一般的なことです。まず、クラスが別のクラスから継承する場合、そのクラスが別のクラスのサブクラスでもある場合は、継承されたメソッドをそのサブクラスに渡します。次に、Java内には、「インターフェイス」とも呼ばれる一連のコーディングがあります。これにより、クラスを拡張せずに、クラスが複数のクラスから継承できるようになります。