【熟】代碼美學(xué):組合為何優(yōu)于繼承?

Prefer Composition Over Inheritance
這兩件事是為了解決同一個問題——代碼復(fù)用
繼承的缺點在于子類和基類發(fā)生耦合

公共的部分 ->作為基類。
但是你很快就會發(fā)現(xiàn)特例需要修改
不通過繼承來復(fù)用代碼就是在組合
使用多個類進行組合
Re_use ; Extending, Using
Abstraction ;Parent Classes Interface
抽象可以復(fù)用代碼,但不需要知道具體復(fù)用的是誰。拿到的是一個局部
繼承 讓使用者拿到某個類的實例,但是實際上傳進來的是子類的實例;
一切都正常運作,但整體上都已經(jīng)面目全非了。
默認的協(xié)議要求子類至少實現(xiàn)了這些方法
接口不像完整的類有各種方法和變量
給出了一份,對象的能力的協(xié)議。接口是最小化的。
?
08:08
?將要用的東西以接口形式作為參數(shù)傳進來
The Cons of Composition 缺點
需要初始化各種內(nèi)部類型。大量的重復(fù)代碼大量的包裝方法。
組合可以減少對象之間的接觸面。
減輕修改帶來的摩擦力。
少量修改時繼承會好用。但需要避免能直接訪問的protected變量
顯式創(chuàng)建需要重寫且能訪問的API
final/ sealed/private 密封methods方法被標記成避免不了解子類而修改出現(xiàn)bug
。
標簽: