今日、私の教授は、SWTの哲学は作曲によって独自のコントロールを作成することの1つであるが、Swingは継承を支持しているようだと奇妙に感じたとコメントしました。
私は両方のフレームワークとはほとんど接触していませんが、C#のWindowsフォームで覚えていることから、通常はSwingと同様にコントロールを拡張しています。
一般に、人々は継承よりも合成を好む傾向があるため、Swing / Windows Formsの人々はなぜ継承ではなく合成を好まなかったのですか?
今日、私の教授は、SWTの哲学は作曲によって独自のコントロールを作成することの1つであるが、Swingは継承を支持しているようだと奇妙に感じたとコメントしました。
私は両方のフレームワークとはほとんど接触していませんが、C#のWindowsフォームで覚えていることから、通常はSwingと同様にコントロールを拡張しています。
一般に、人々は継承よりも合成を好む傾向があるため、Swing / Windows Formsの人々はなぜ継承ではなく合成を好まなかったのですか?
回答:
JComponent
多くの機能を公開します。JComponent
インターフェースであり、コンポーネントが構成で実装された場合、単純なコンポーネントには、数十の簡単なメソッドラッパーが必要です。
class MyComponent implements JComponent {
JPanel panel;
public boolean contains(int x, int y) {
return panel.contains(x, y);
}
...
}
合成よりも継承を優先する効率的な理由もあります。オーバーライドにはコストはかかりません(super
呼び出しがないと仮定)、合成には余分なコストがかかりますINVOKEVIRTUAL
。これがSwingの設計に影響を与えたかどうかはわかりませんが、コレクションクラスにとって大きな懸念事項です。
Swing Frameworkは、実際にはComposite Design Patternに従って設計されています。そこには多くの継承がありますが、通常は構成を使用して独自のフォームを構成します。つまり、フォームは、中間レベルのコンテナーとコントロールの構成です。
ジャワでは、そのA たくさんより簡単という理由だけで、継承を使用して終了するには、すべてが仮想です。JTable / JFrameの「機能」を修正する必要がありますか?それを拡張し、問題のメソッドをオーバーライドしてから、代わりにどこでもテーブル/フレームを使用します。
データバインディングが設計の主要な機能であるWPFのようなものを使用すると、継承ではなく構成がはるかに簡単になります。
virtual
あり、オーバーライドするには、明示的にとして宣言する必要がありoverride
ます。Javaでは、表示できるものをすべてオーバーライドでき、サブクラスでの可視性を高めることができます(サブクラスで保護されたメソッドをパブリックにすることができます!)
final
基本クラス自体がでなくても、Javaのメソッドをfinal
。
C#3.5から、継承よりも構成の概念を可能にする拡張メソッドと呼ばれる概念があります。
このプロセスでは、既存のクラスに新しい機能をレンダリングする拡張クラスを追加するだけで、既存のクラスに拡張機能を実装します。
参照できます 詳細についてこちらをしてください