3

私はスーパークラスと別のクラスの計画された旅をしたいクラスの旅を持っています。計画されたjourneyクラスは、フォームが含まれているためJFrameを拡張します。ただし、このクラスもJourneyを拡張する必要があります。

これを行うための可能な方法はありますか?

4

10 に答える 10

4

モデルとビューを混在させないでください。両方のドメインを明確に分離しておけば、多重継承は必要ありません(今回)。

旅のモデルクラスが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の適切な位置に追加できます。

于 2011-01-04T14:01:15.840 に答える
3

Javaには多重継承はありません。言語では許可されていません。代わりにインターフェイスを使用するようにデザインを変更できるかどうかを確認してください。(ほとんどの場合可能です)。

于 2011-01-04T13:18:58.957 に答える
2

いいえ、これはJavaでは不可能です。通常、同様の効果はインターフェイスを使用して実現できます(ここでは、Journeyがインターフェイスである可能性があります)が、メソッドの実装を継承する場合は、設計を再考する必要があります。

あなたの説明からの私の最も良い推測は、クラスをデータモデルを表す1つの階層と、データを表示するためにJFrameを拡張する別の階層に分けることができるということです。

于 2011-01-04T13:20:18.840 に答える
2

SunJavaチュートリアル継承ページから

定義:別のクラスから派生したクラスは、サブクラス(派生クラス、拡張クラス、または子クラス)と呼ばれます。サブクラスの派生元のクラスは、スーパークラス(基本クラスまたは親クラスでもあります)と呼ばれます。

スーパークラスを持たないObjectを除いて、すべてのクラスには1つだけの直接スーパークラス(単一継承)があります。他の明示的なスーパークラスがない場合、すべてのクラスは暗黙的にObjectのサブクラスになります。

クラスは、クラスから派生したクラスなどから派生したクラスから派生したり、最終的に最上位のクラスであるObjectから派生したりすることができます。このようなクラスは、オブジェクトに戻る継承チェーン内のすべてのクラスの子孫であると言われます。

于 2011-01-04T13:20:35.430 に答える
2

Journey拡張するか、インターフェースJFrameを作成します。Journey

オブジェクト構造に最も適したオプションを選択してください。

Journey延長することが理にかなっている場合は、それをJFrame行います。このように、をPlannedJourney拡張すると、から行うJourneyすべてのことも継承します。JourneyJFrame

これが意味をなさない場合はJourney、インターフェースを作成し、をPlannedJourney実装してJourneyください。 PlannedJourneyからコードを継承することはできませんがJourney、メソッドシグネチャを継承し、オブジェクトをJourneyに加えてとして渡すことはできますJFrame


Swingを使用しているときは、モデルビューから分離していることを確認してください。データは1セットのオブジェクト(Model)に保存する必要があり、そのデータを表示するSwingコンポーネントは別のオブジェクトセット(View)である必要があります。これは、データ関数をカプセル化し、それらをGUIオブジェクトから分離し、モデル上のビューの一方向の依存を強制するのに役立ちます。オブジェクトはおそらく表示する必要があると考えてください。このように、はそれを表示するだけで処理でき、独自の階層を持つことができるへの参照のみを拡張して運ぶことができます。JourneyJourneyFrameJourneyFrameJFrameJourney

于 2011-01-04T13:24:52.797 に答える
1

いいえ。Javaには多重継承はありません。これは意図的な設計上の決定でした。

代わりに、スーパークラスの1つをインターフェースとして表現する方法を見つけることができれば、これで問題が解決する可能性があります。

于 2011-01-04T13:19:42.650 に答える
1

PlannedJourneyにJourneyを拡張させてから、PlannedJourneyにJFrameのインスタンスを持たせるのがより良い方法だと思います。見方によっては一石二鳥のように見えます。

于 2011-01-04T13:23:38.263 に答える
1

Javaでの多重継承は不可能です。

インターフェイスの複数の実装が可能です。これは、Javaでの多重継承に最も近いものです。

可能であれば、継承よりも構成を優先します。効果的なJavaから引用。

于 2011-01-04T13:25:47.240 に答える
1

Joshua Blochの「EffectiveJava」をまだ読んでいない場合は、今がその時です。特に「継承よりも構成を優先する」のセクション。Javaでは複数の継承を行うことができないため、ほとんどの場合、JFrame拡張機能にUIであるPlannedJourneyへの参照を含めることが正しいアプローチである理由を説明します。

于 2011-01-04T16:54:57.387 に答える
0

何が必要かは正確にはわかりませんが、Javaでは多重継承が非常に可能で一般的なことです。まず、クラスが別のクラスから継承する場合、そのクラスが別のクラスのサブクラスでもある場合は、継承されたメソッドをそのサブクラスに渡します。次に、Java内には、「インターフェイス」とも呼ばれる一連のコーディングがあります。これにより、クラスを拡張せずに、クラスが複数のクラスから継承できるようになります。

于 2013-05-20T20:13:48.057 に答える