ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          subclass應該繼承superclass的函數和數據。但如果它們不想或不需要繼承,又該怎么辦呢?它們得到所有禮物,卻只從中挑選幾樣來玩!

          按傳統說法,這就意味繼承系統設計錯誤。你需要為這個subclass新建一個兄弟(sibling class),再運用Push Down Method(328)和Push Down Field(329)把所有用不到的函數下推給那兄弟。這樣一來superclass就持有所有subclasses共享的東西。常常你會聽到這樣的建議:所有superclasses都應該是抽象的(abstract)。

          既然使用[傳統說法]這個略帶貶義的詞,你就可以猜到,我們不建議你這么做,起碼不建議你每次都這么做。我們經常利用subclassing手法來復用一些行為,并發現這可以很好地應用于日常工作。這也是一種壞味道,我們不否認,但氣味通常并不強烈。所以我們說:如果Refused Bequest引起困惑和問題,請遵循傳統忠告。但不必認為你每次都得那么做。十有八九這種壞味道很淡,不值得理睬。

          如果subclass復用了superclass的行為(實現),卻又不原意支持superclass得接口,Refused Bequest的壞味道就會變得濃烈。拒絕繼承superclass的實現,這一點我們不介意;但如果拒絕繼承superclass的接口,我們不以為然。不過即使你不原意繼承接口,也不要胡亂修改繼承體系,你應該運用Replace Inheritance with Delegation(352)來達到目的。
          posted on 2005-08-19 17:26 ivaneeo 閱讀(384) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
          主站蜘蛛池模板: 西畴县| 无棣县| 张家港市| 武胜县| 巨野县| 金湖县| 乌兰县| 岢岚县| 莱西市| 六枝特区| 凤翔县| 犍为县| 嘉禾县| 汉寿县| 漳州市| 朝阳县| 宽城| 同心县| 贵港市| 樟树市| 新竹县| 宜宾县| 乐平市| 英吉沙县| 始兴县| 营口市| 牟定县| 盘锦市| 巴塘县| 马边| 康定县| 隆尧县| 荔浦县| 镇巴县| 兴隆县| 安庆市| 青阳县| 东乡县| 樟树市| 涡阳县| 讷河市|