圖像和聲音文件(5)
4.除非所有繼承的方法都有意義,否則不要使用繼承。
Calendar類的實例表示,因此可以使用繼承。
class Holiday extends GregorianCalendar (...)
add,這個方法可以將假日轉(zhuǎn)換成非假日:
Holiday christmas;
christmas.add(Calendar.DAY_OF _MONTH,12);
因此,繼承對于這個例子來說并不太適宜。
周能,能不說真能e就不會出現(xiàn)這個問題。由于這個Loeaoate類是不可是所以沒有任何方法能夠把假日變成非假日。
5.在覆蓋方法時,不要改變預(yù)期的行為。
答換原用不僅應(yīng)用于消法,更重要的是,它也適用于行為。在覆蓋一個方法的時候,應(yīng)該毫無緣由楚改變它的行為。就這一點而言,編譯器不會提供任何幫助,即編譯器不會查重新定義的方法是否有意義。例如,可以重新定義toliday類中的add方法來“修正”這個方法的問題,可能什么也不做,或者拋出一個異常,或者是前進(jìn)到下一個假日。然而,這樣一個“修正”違反了替換原則。對于以下語句序列
int dl = x.get(Calendar.DAY_OF _MONTH);
x.add(Calendar.DAY OF MONTH, 1);
int d2 = x.get(Calendar.DAY_OF MONTH);
System.out.println(d2-d1);
不管×的類型是GregorianCalendar還是Holiday,執(zhí)行上述語句后都應(yīng)該得到預(yù)期行為。當(dāng)然,這是個難題。理智和不理智的人們可能就預(yù)期行為是什么爭論不休。例如,有些人爭論說,替換原則要求Manager.equals忽略bonus字段,因為Employee.equals就忽略了這個字。實際上,憑空討論這些問題毫無意義。歸根結(jié)底,關(guān)鍵在于在子類中覆蓋方法時,不要離最初的設(shè)計想法。
6.使用多態(tài),而不要使用類型信息。
只要看到類似下面的代碼
if (x is of type 1)
action1(x);