復合優先於繼承,繼承是實現**重用的有力手段,並不是所有情況都適用,使用不當會導致軟體變得很脆弱。與方法呼叫不同的是,繼承打破了封裝性。
總而言之,組合和繼承,都能實現對類的擴充套件。但是要分具體情況用哪個實現,是has-a,還是is-a的關係。
兩者區別如下表所示:
組合 繼承
has-a關係
is-a關係
執行期決定
編譯期決定
不破壞封裝,整體和區域性松耦合
破壞封裝,子類依賴父類
支援擴充套件,隨意增加組合類
只能繼承乙個父類,必須包含所有方法,增加系統複雜性
動態選擇組合類方法
復用父類方法
來自 :
decorator模式對組合的應用是最經典詮釋:
上碼
public ice(product product)public double money()
}
//加奶:
class milk implements product
public double money()
}
//加巧克力:
class chocolate implements product
public double money()
} public class decoratormodel
} 來自
Chapter 02 復合 VS 繼承
復合優先於繼承,繼承是實現 重用的有力手段,並不是所有情況都適用,使用不當會導致軟體變得很脆弱。與方法呼叫不同的是,繼承打破了封裝性。總而言之,組合和繼承,都能實現對類的擴充套件。但是要分具體情況用哪個實現,是has a,還是is a的關係。兩者區別如下表所示 組合 繼承 has a關係 is a關...
chapter 02 網路程式設計
1 建立tcp ip套接字 tcpsock socket.socket socket.af inet,socket.sock stream 2 建立udp ip套接字 tcpsock socket.socket socket.af inet,socket.sock stream 2 建立tcp伺服器...
Chapter02 第四節 函式
函式定義 函式原型 函式呼叫 函式定義即定義乙個函式 形如 double sqrt double x 函式呼叫即呼叫這個函式,形如 double value sqrt x 函式原型即函式宣告,如double sqrt double 編譯系統要求先編譯函式,再呼叫函式。也就是定義要放在函式之前。但是不...