2013-05-31 38 views
12

最近我正在考慮製作我自己的Date庫。 我在這裏發現一個問題,這裏是:如何在Java中完全隱藏超類的方法

如何隱藏子類中的超類方法?所以它不會在子類中檢測到。

例如: 我有一個擴展到Date的類和另一個擴展到上一個類的類。 在我的新子類中,它檢測Date中的所有方法,比如getDate等。 我想要的是,在我的子類中,Date中的所有方法都未被檢測到,不會拋出 異常,但完全未被檢測到。

感謝提前:)

+1

有沒有辦法做到這一點。唯一的解決辦法是由同一個名字有方法是'private'的方法在父類中,但這意味着它不能從父類以外的任何地方調用。 – fge

+0

我試圖在我的超類中將getDate重寫爲private,但它給了我一個錯誤,我應該將其更改爲public。 –

回答

24

贊成構成over繼承在這裏。

而是繼承了日期有它作爲您的指明MyDate類中的成員字段。

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

    // no getDate() available 

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

你得到過日期的API,你的子類中可見的完全控制(無需拋出任何異常),但是當你想隱藏想個辦法要保持可訪問的那些方法這種方法更實用。

+0

嗯,喬達日期使用這樣的模式? 因爲它的返回類型是DateTime而不是Date,雖然有一種方法可以將它轉換爲Date。 –

+0

這就是它的美麗。您可以完全控制API。從方法名稱到返回類型。您可以選擇簡化和/或限制API。 –

+0

好吧,我發現這是對我的問題最接近的答案,我試圖理解邏輯。 順便說一句@Ravi -san,你知道爲什麼當我有這個 '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

代表團可以是一個整潔的解決方案,lombok也可以使它看起來乾淨:http://projectlombok.org/features/Delegate.html – Vegard

+0

這個代表團不會讓我的類有返回類型的日期,是嗎? –

+0

@ A-SM爲什麼不呢? – stinepike

5

不可能的。

如果你想要什麼是可能的,那麼inherintence將被打破。突然,當您使用某種IS-A類型Date時,您將無法調用任何Date類型的方法。這在幾個層面上是錯誤的。例如,它打破Liskov Substitution Principle

0

覆蓋的方法,使之一成不變的,它會隱藏超級類