2013-05-31 32 views
12

最近私は自分のDateライブラリを作ることを考えています。 ここで問題が見つかりました。ここにあります。Javaでスーパークラスメソッドを完全に非表示にする方法

サブクラスでスーパークラスメソッドを非表示にするにはどうすればよいですか?したがって、サブクラスでは検出されません。

例: Dateに拡張されたクラスと、以前のクラスに拡張された別のクラスがあります。 私の新しいサブクラスでは、getDateなどのDateのすべてのメソッドを検出します。 私のサブクラスでは、Dateのすべてのメソッドは検出されず、例外は発生しません。事前に

感謝:)

+1

を非表示になりますそれをする方法はありません...唯一の解決策は、同じ名前のメソッドを持っているだろう 'private'ことしかし親クラス以外の場所から呼び出し可能でないことを意味します。 – fge

+0

スーパークラスでgetDateをプライベートにオーバーライドしようとしましたが、エラーが発生します。これをpublicに変更する必要があります。 –

答えて

24

ここでは継承上の構成を優先します。

の代わりにあなたのMyDateに該当クラス内のメンバーフィールドとしてそれを持っている日付を継承。方法は、あなたがアクセス可能なままにしたいものを上回って非表示にしたいときは、(任意の例外をスローすることなく)あなたのサブクラスに見えるのですが、このアプローチは、より実用的である日のAPIを完全に制御を得る

public class MyDate { 
    private Date dt = new Date(); 

    // no getDate() available 

    public long getTime() { 
     return date.getTime(); 
    } 
} 

+0

うーん、Joda Dateはこのようなパターンを使用していますか? 戻り値の型はDateではなくDateであるため、Dateに変換できるメソッドがあります。 –

+0

それはそれの美しさです。あなたはAPIを完全に制御できます。メソッド名から戻り値の型へ必要に応じてAPIを簡素化および/または制限することができます。 –

+0

私はこれが私の問題に最も近い答えであることを知っています、私は論理を理解しようとしています。 ところで@Raviさん、私がこれを持っている理由を知っていますか? 'Date d = new Date(); System.out.println(d); ' これは、_Sat Jun 01 04:44:47 ICT 2013_のような出力を生成します。 しかし私は自分のクラスオブジェクトを宣言するときのように 'MyClass mc = new MyClass(); System.out.println(mc); ' [email protected]_ のような出力を生成します。クラスオブジェクトを出力するときに、Dateオブジェクトのような出力を得るにはどうすればよいですか? –

8

それが延長されている場合は、それを隠すことはできませんが、上書きすることができます。

あなたのAPIのユーザーは、私がオーバーライドを示唆し、ちょうどこの例外をスローする方法使用しないようにしたい場合:

UnsupportedOperationException 

しかし、あなたが書いたものを見ていると、あなたはあなたのクラスで日付フィールドにすることを検討すべきです、クラスを拡張しないでください。

4

あなたの代わりに

public class NewDate{ 
    Date d; 
    NewDate(){ 
    d = new Date(); 
    } 

    methodsYouWantToChange(){ 
    // new implementation 
    } 


    methodsYouDontWantToChange(){ 
    d.methodsYouDontWantToChange(); 
    } 


    newMethods(){ 
    // new implementation 
    } 
} 
+1

代表団はきちんとした解決策になることができます、ロンボクはまたそれをきれいに見せることができます:http://projectlombok.org/features/Delegate.html – Vegard

+0

この代表団は、戻り値の型を持つクラスを許可しませんでしたか? –

+0

@ A-SMどうしてですか? – stinepike

5

ない可能性が委任を使用することができます。

あなたが望むものが可能ならば、継承は壊れます。突然、特定のIS-AタイプDateを使用すると、Dateタイプのメソッドを呼び出すことはできません。これはいくつかのレベルで間違っています。たとえば、Liskov Substitution Principleが破損しています。

0
は、メソッドをオーバーライドし、それを静的にする

、それがスーパークラスのメソッド

関連する問題