組合還是繼承
假設(shè)我們要統(tǒng)計set的歷史元素數(shù)。
1. 定義一個類,申明一個靜態(tài)成員變量作為計數(shù)器,嘗試重寫add和addAll方法,計數(shù)器增加。
發(fā)現(xiàn)數(shù)量統(tǒng)計是預(yù)期的2倍,因為addAll里面調(diào)用了add,被兩次計數(shù)。
如果之重寫add,假如addAll以后的發(fā)布版本中不調(diào)用了add了怎么辦。如果把addAll全部重寫,那么父類的實現(xiàn)被架空。假如為了保證安全,父類在元素加入之前做檢查,我們架空的方法就很危險。
2. 如果父類新增了一個方法,簽名和你子類中的一個方法一樣,但是返回值不一樣,傻眼了,編譯通不過。
3. 咋整,用組合模式
新建前置類實現(xiàn)set接口,同時定義一個set的成員變量,繼承方法實現(xiàn)調(diào)用成員變量的方法。
創(chuàng)建工具類 再擴展前置類,實現(xiàn)計數(shù)。就是裝飾器模式。
這種玩法和委托有所區(qū)別,在于包裝的東西和自己有沒有關(guān)系
還有在回調(diào)場景下,不適合。
4.適合用組合卻用了繼承,比如Properties繼承了HashTable,Stack繼承了Vector。
Properties對象實例p 可以調(diào)用父類的getKey()得到一個很粗糙的值,而且Properties設(shè)計的時候只支持String,但是p調(diào)用父類的put,隨便什么都可以放進去,很亂套。
所以只有 在確定A肯定是B的時候,A再去繼承B。