よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

August 02, 2003 [おもひで]

[Misc] GUIは継承使わない!?(2)

バカが征くより。

原則的に、メソッドをオーバーライドする必要がなければサブクラスを作る必要はありません。機能の追加だけならば合成でも可能です。

頭の中を整理するためには必ずしもクラスはいりません。名前があればいいのですから、それは変数名やメソッド名であってもいいわけです。

Javaで恐縮ですが、下のコードでは、ボタンを並べるためにPanelというコンテナを使っています。ここでは、Panelが本来持っている機能の他には必要なものはありません。ですから、ButtonPanelというサブクラスを作るのではなく、単にgetButtonPanel()というメソッドを用意しました。

ButtonPanelというクラスを用意するのとgetButtonPanelというメソッドを用意するのとで、頭の中の整理の度合が変わるとは思えません。

実はサンプルとしてあげていただいた例では私もButtonPanelをPanelのサブクラスとして定義することはないと思います。ただ、それはどちらかというと粒度の問題じゃないかと思っていて、Testクラス自体(が結構複雑)であればそれをFrameのサブクラスにすると思います。

理由は、前回も触れましたが「GUIの部品をいくつも集めたモノを新たに1つの部品として定義する」ということです。従って、getFrame()というメソッドを用意してFrameのインスタンスを返すよりもnew Test()とだけして、後はFrameの機能+αを持ったTestというGUI部品を使う、と考えた方が私的にはすっきりするんですよね。

具体的には、JFileChooserみたいなものを作るときに、それをJComponentクラスを継承させずに、GUIとは関係ないクラスを作ってそれのgetFileChooser()というメソッドを作るかというと、やっぱりJComponentクラスを継承させた方が良いんじゃないのかなと。

どちらかというと「確かに継承は使わずにも済む」ということより「積極的に継承を使わない理由」が実は一番知りたかったりするのですが...。

#「滅多にいらない」という前回の文脈から、「使わない方がよい」と受け取りました。ここが誤解だったら申し訳ないです。


編集