2011-09-14 24 views
8

Overriding and Hiding Methodsチュートリアルを読んだことがあります。スーパークラスの隠蔽メソッド

サブクラスがスーパークラスで クラスメソッドと同じシグネチャを持つクラスのメソッドを定義する場合、スーパークラスにおいて、サブクラス皮内方法 いずれかとそれから、私は、次集め。私はこのデザインについては好きではない何

import javax.swing.JTextArea; 

public final class JWrappedLabel extends JTextArea{ 
    private static final long serialVersionUID = -844167470113830283L; 

    public JWrappedLabel(final String text){ 
     super(text); 
     setOpaque(false); 
     setEditable(false); 
     setLineWrap(true); 
     setWrapStyleWord(true); 
    } 

    @Override 
    public void append(final String s){ 
     throw new UnsupportedOperationException(); 
    } 
} 

appendはまだサブクラスの見える方法であるということである。

はそのように、私は次のようでした。 UnsupportedOperationExceptionを投げる代わりに、私は体を空のままにしておくことができました。しかし、どちらも醜いと感じる。

これは、スーパークラスのメソッドを隠すより良いアプローチがあるのでしょうか?

+2

ばかり強調(@Simoneは完全な答えを持っている)のために:あなた**はいけません**スーパークラスのオーバーライドメソッドその契約を履行することなく。ところで、引用した文は_class_メソッドに関するもので、ここでは_instance_メソッドをオーバーライドします。 – kleopatra

+0

@kleopatra、私はこの質問がそれ以上注目を集めないと感じたので、私は答えをマークしました。私はまだこの質問が十分に答えられたとは思わない。多分あなたは自分のものを提供することができますか?あなたは知識があるようです! :D – mrkhrts

+0

私はそれが古いの質問を知っているが、私はちょうどこれを見つけた... 私は通常、これを行うためにあなたの方法を使用して、私もやっていることは、クラスを拡張することができないように最終的にメソッドをオーバーライドすることです特定の機能を追加できるようにする。 –

答えて

11

可能であれば、組成物を使用してください。これは、Joshua BlochがEffective Java, Second Editionでお勧めします。

項目16:継承を超える好意組成例えば

import javax.swing.JTextArea; 

public final class JWrappedLabel { 
    private static final long serialVersionUID = -844167470113830283L; 

    private final JTextArea textArea; 

    public JWrappedLabel(final String text){ 
     textArea = new JTextArea(text); 
     textArea.setOpaque(false); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
    } 

    //add methods which delegate calls to the textArea 
} 
+0

+1、これは本当に望ましいわけではありませんが、私は提案を感謝します。それは理にかなっていますが、 'JWrappedLabel'インスタンスをコンテナに直接追加することはできません。代わりに、私は本当にしたくないテキスト領域のオブジェクトを照会する必要があります。しかし、構成が唯一の他の選択肢であるならば、私はむしろ例外を投げるだろう。いずれにしても、最終的な解決策はむしろ醜いように見える。 :/ – mrkhrts

+1

私が追加する唯一のことは、JWrappedLabelをコンテナに追加できるインターフェイスを実装することです。これはmrkhrtsが上記の問題を解決します。 –

+0

@James DW、私はそれを見ていきます、ありがとう! :D – mrkhrts

3

私が知っていることはありません。

これはOOPの問題です。クラスはまだJTextAreaなので、JTextAreaのメソッドをすべてそこに置いて正しく動作することを期待して、サブクラスを認識しないコードでJTextAreaとして扱うことができます。

新しいインターフェイスを定義する必要がある場合は、JTextAreaを拡張せずにカプセル化する新しいクラスを定義する必要があります。