なぜWindows Forms / Swingフレームワークは、コンポジションよりも継承を好むのですか?


12

今日、私の教授は、SWTの哲学は作曲によって独自のコントロールを作成することの1つであるが、Swingは継承を支持しているようだと奇妙に感じたとコメントしました。

私は両方のフレームワークとはほとんど接触していませんが、C#のWindowsフォームで覚えていることから、通常はSwingと同様にコントロールを拡張しています。

一般に、人々は継承よりも合成を好む傾向があるため、Swing / Windows Formsの人々はなぜ継承ではなく合成を好まなかったのですか?


2
これらのAPIが登場してから15〜20年で多くの変化がありました。レンダリングエンジンには、「過去」の任意の具体的なクラスのインスタンスに対して画面オブジェクトをバインドするための魔法のXMLグルーがありませんでした;)

1
私が見るほとんどのSwingコードは、構成ごとに拡張機能を使用しています。あなたの教授がどこでデータを取得しているかはわかりません。

私自身は、構図ではなく継承でネット上で多くのスイングを見てきました-ほとんどがチュートリアルです。しかし、Windowsフォームは、継承のみに基づいて実際に使用されます!
エリジウムをむさぼり食った

回答:


7

JComponent多くの機能を公開しますJComponentインターフェースであり、コンポーネントが構成で実装された場合、単純なコンポーネントには、数十の簡単なメソッドラッパーが必要です。

class MyComponent implements JComponent {
    JPanel panel;
    public boolean contains(int x, int y) {
        return panel.contains(x, y);
    }
    ...
}

合成よりも継承を優先する効率的な理由もあります。オーバーライドにはコストはかかりません(super呼び出しがないと仮定)、合成には余分なコストがかかりますINVOKEVIRTUAL。これがSwingの設計に影響を与えたかどうかはわかりませんが、コレクションクラスにとって大きな懸念事項です。


2

Swing Frameworkは、実際にはComposite Design Patternに従って設計されています。そこには多くの継承がありますが、通常は構成を使用して独自のフォームを構成します。つまり、フォームは、中間レベルのコンテナーとコントロールの構成です。


「つまり、フォームは中レベルのコンテナとコントロールの組み合わせです。」承知しました。しかし、私が通常見ているのは、人々が独自のウィンドウ(またはSwingで呼び出されるもの)を作成する場合、コンポジションを使用する代わりにウィンドウクラスから継承するということです。
エリジウム

@devoured elysiumそれは本当です。しかし、フォームを作成するには、構成を使用します。したがって、それは少しの継承と多くの構成です。

@devoured、それは彼らが使用するチュートリアルが簡潔さを好むのでベストプラクティスに従っていないことに気付いていない人の場合だと思います。
ピーターテイラー

1

ジャワでは、そのA たくさんより簡単という理由だけで、継承を使用して終了するには、すべてが仮想です。JTable / JFrameの「機能」を修正する必要がありますか?それを拡張し、問題のメソッドをオーバーライドしてから、代わりにどこでもテーブル/フレームを使用します。

データバインディングが設計の主要な機能であるWPFのようなものを使用すると、継承ではなく構成がはるかに簡単になります。


「すべてが仮想」とはどういう意味ですか?
ジョナス

Javaでは、すべてのメソッドは暗黙的に仮想です(オーバーライドできます)。C#では、メソッドをとして明示的に宣言する必要がvirtualあり、オーバーライドするには、明示的にとして宣言する必要がありoverrideます。Javaでは、表示できるものをすべてオーバーライドでき、サブクラスでの可視性を高めることができます(サブクラスで保護されたメソッドをパブリックにすることができます!)
ジョンガードナー

オーバーライドできないことに注意してください final基本クラス自体がでなくても、Javaのメソッドをfinal
perp

それは本当です@perp。しかし、javaでは、あなたは邪魔にならないようにしなければなりません(最終を追加する)仮想防ぐために。C#は反対の方法であり、仮想化するには邪魔にならないようにする必要があります。また、標準のJavaランタイムのごく一部が最終マークされます。
ジョンガードナー

1

効果的なJavaの、項目17、ブロッホは、クラスと述べて設計された継承のためには、「オーバーライドメソッドの自己使用を文書化しなければなりません。」これの特徴はこの実装のフレーズです。JTableやなどのクラスで表示されますJInternalFrame。Swingの設計による継承の1つの尺度です。


-2

C#3.5から、継承よりも構成の概念を可能にする拡張メソッドと呼ばれる概念があります。

このプロセスでは、既存のクラスに新しい機能をレンダリングする拡張クラスを追加するだけで、既存のクラスに拡張機能を実装します。

参照できます 詳細についてこちらをしてください


新しいWinForms Controlクラスの作成との関連性は見当たりません。詳しく説明してもらえますか?
ピーターテイラー

@Peter:これは、Windowsフォームクラスにのみ関係しません。これは、コードからも適用できます。静的クラスを追加してから、このように1番目の引数で新しいメソッドを追加するだけで、既存のクラスを拡張して、ベースオブジェクトをリンクできるようにすることができます。コードをコンパイルすると、新しく追加されたメソッドが基本クラス自体のメソッドとして取得されます。これが構成の状態です。私が正しいことを願っています
。-サラバナン

1
拡張メソッドが何であるかを知っており、時には非常に便利ですが、この質問は新しいクラスを作成するためのさまざまなアプローチに関するものです。
ピーターテイラー

@Peter:それから、C#には他の注目すべき機能がないことを理解していることを除いて、部分クラスの使用のみを指すことができます。あなたが何かを知っているなら、私に知らせてください。
サラバナン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.