最近我正在考慮製作我自己的Date庫。 我在這裏發現一個問題,這裏是:如何在Java中完全隱藏超類的方法
如何隱藏子類中的超類方法?所以它不會在子類中檢測到。
例如: 我有一個擴展到Date的類和另一個擴展到上一個類的類。 在我的新子類中,它檢測Date中的所有方法,比如getDate等。 我想要的是,在我的子類中,Date中的所有方法都未被檢測到,不會拋出 異常,但完全未被檢測到。
感謝提前:)
最近我正在考慮製作我自己的Date庫。 我在這裏發現一個問題,這裏是:如何在Java中完全隱藏超類的方法
如何隱藏子類中的超類方法?所以它不會在子類中檢測到。
例如: 我有一個擴展到Date的類和另一個擴展到上一個類的類。 在我的新子類中,它檢測Date中的所有方法,比如getDate等。 我想要的是,在我的子類中,Date中的所有方法都未被檢測到,不會拋出 異常,但完全未被檢測到。
感謝提前:)
贊成構成over繼承在這裏。
而是繼承了日期有它作爲您的指明MyDate類中的成員字段。
public class MyDate {
private Date dt = new Date();
// no getDate() available
public long getTime() {
return date.getTime();
}
}
你得到過日期的API,你的子類中可見的完全控制(無需拋出任何異常),但是當你想隱藏想個辦法要保持可訪問的那些方法這種方法更實用。
嗯,喬達日期使用這樣的模式? 因爲它的返回類型是DateTime而不是Date,雖然有一種方法可以將它轉換爲Date。 –
這就是它的美麗。您可以完全控制API。從方法名稱到返回類型。您可以選擇簡化和/或限制API。 –
好吧,我發現這是對我的問題最接近的答案,我試圖理解邏輯。 順便說一句@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對象的輸出? –
您不能隱藏它,如果它被延長,但是你可以重寫。
,如果你希望你的API用戶不使用方法我建議重寫,只是拋出此異常:
UnsupportedOperationException
,但看着你寫的東西,你應該考慮的日期在你的類中的字段,不延長班級。
可以使用代表團代替
public class NewDate{
Date d;
NewDate(){
d = new Date();
}
methodsYouWantToChange(){
// new implementation
}
methodsYouDontWantToChange(){
d.methodsYouDontWantToChange();
}
newMethods(){
// new implementation
}
}
不可能的。
如果你想要什麼是可能的,那麼inherintence將被打破。突然,當您使用某種IS-A類型Date
時,您將無法調用任何Date
類型的方法。這在幾個層面上是錯誤的。例如,它打破Liskov Substitution Principle。
覆蓋的方法,使之一成不變的,它會隱藏超級類
有沒有辦法做到這一點。唯一的解決辦法是由同一個名字有方法是'private'的方法在父類中,但這意味着它不能從父類以外的任何地方調用。 – fge
我試圖在我的超類中將getDate重寫爲private,但它給了我一個錯誤,我應該將其更改爲public。 –