継承の実装に関する私の現在の理解では、IS-A関係が存在する場合にのみクラスを拡張する必要があります。親クラスがさらに異なる機能を持つより具体的な子タイプを持つことができるが、親で抽象化された共通要素を共有する場合。
私のJava教授が私たちにすべきだと勧めていることのために、私はその理解に疑問を抱いています。彼は、JSwing
私たちがクラスで構築しているアプリケーションのために
一つは、すべての拡張する必要がありますJSwing
クラス(JFrame
、JButton
、JTextBox
(部品サイズ、部品ラベルなどのような)別のカスタムクラスに、など)と、それらに関連するGUIカスタマイズを指定します
これまでのところこれでいいのですが、彼はさらに、すべてのJButtonが独自のカスタム拡張クラスを持つべきであり、唯一の識別要素はラベルであるとアドバイスしています。
たとえば、GUIに2つのボタンOkayとCancelがある場合。彼は、以下のように拡張することを推奨しています。
class OkayButton extends JButton{
MainUI mui;
public OkayButton(MainUI mui) {
setSize(80,60);
setText("Okay");
this.mui = mui;
mui.add(this);
}
}
class CancelButton extends JButton{
MainUI mui;
public CancelButton(MainUI mui) {
setSize(80,60);
setText("Cancel");
this.mui = mui;
mui.add(this);
}
}
ご覧のとおり、唯一の違いはsetText
機能にあります。
それでは、この標準的な慣習はありますか?
ところで、これが議論されたコースは、Javaのベストプログラミングプラクティスと呼ばれています
[教授からの返信]
そこで私は教授と問題について話し合い、答えに挙げられているすべての点を挙げました。
彼の正当性は、サブクラス化がGUI設計標準に従って再利用可能なコードを提供することです。たとえば、開発者が1つのウィンドウでカスタムボタンOkay
とCancel
ボタンを使用している場合、同じボタンを他のウィンドウにも配置する方が簡単です。
理由はわかりますが、それでも継承を利用してコードを脆弱にしているだけです。
後で、開発者はボタンを誤って呼び出して変更setText
する可能性がありOkay
ます。その場合、サブクラスは単に迷惑になります。
JButton
単純にを作成してJButton
同じパブリックメソッドを呼び出すことができるのに、なぜコンストラクタでパブリックメソッドを拡張して呼び出すのですか?