子類應(yīng)該繼承超類的函數(shù)和數(shù)據(jù). 但如果它們不想或不需要繼承, 又該怎么辦呢? 它們得到所有禮物, 卻只從中挑選幾樣來玩.
按傳統(tǒng)說法, 這就意味著繼承體系設(shè)計錯誤. 你需要為整個子類新建一個兄弟類, 在運用Push Down Method(函數(shù)下移) 和 Push Down Field(下移字段) 把所有用不到的函數(shù)下推給那個兄弟. 這樣一來, 超類就只持有所有子類共享的東西了. 你常常聽到這樣的建議:
所有超類都應(yīng)該是抽象(abstract)的.
既然使用"傳統(tǒng)說法" 這個略帶貶義的詞, 你就可以猜到, 我們不建議你這么做, 最起碼不建議你每次都這么做. 我們經(jīng)常利用繼承來復(fù)用一些行為, 并發(fā)現(xiàn)這可以很到的應(yīng)用與日常工作. 這也是一種壞味道, 我們不否認, 但氣味通常并不強烈. 所有我們說:
如果Refused Bequest引起困惑和問題,請遵循傳統(tǒng)忠告.
但不必認為你每次都得那么做.十有八九這種壞味道很淡, 不值得理財.
如果子類復(fù)用了超類的行為(實現(xiàn)), 卻又不愿意支持超類的接口, Refused Bequest的壞味道就會變的濃烈. 拒絕繼承超類的實現(xiàn),這一點我們不介意; 但如果拒絕繼承超類的接口,我們不以為然. 不過即使你不愿意繼承接口, 也不要胡亂修改繼承體系, 應(yīng)該運用Replace Inheritance with Delegation(用代理替代繼承) 來達到目的.