《面向对象的思考过程(原书第4版)》一1.11 组合
本節書摘來自華章出版社《面向對象的思考過程(原書第4版)》一書中的第1章,第1.11節,[美] 馬特·魏斯費爾德(Matt Weisfeld) 著黃博文 譯更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。
1.11 組合
對象中包含其他對象非常自然。比如電視機包含開關和顯示屏。計算機包含顯卡、鍵盤和光驅。可以將計算機自身看成一個對象,而光驅也是一個有效的對象。
事實上,你可以打開計算機把光驅取下來放到你手上。計算機和光驅都可以看作對象。只是計算機包含其他的對象(譬如光驅)。
使用其他對象來構建或結合成新的對象,這種方式就是組合。
1.11.1 抽象
和繼承一樣,組合也是一種構建對象的機制。事實上,我想說只有兩種方式來使用其他類構建新類,這兩種方式就是繼承和組合。之前已經看到了,繼承允許類繼承另一個類。我們可以把屬性和行為抽象到通用類中。例如,狗和貓都是哺乳動物,因為狗是(is-a)哺乳動物,貓也是(is-a)哺乳動物。而使用組合,我們也可以把類嵌入其他類中來構造新類。
我們可以拿車和引擎之間的關系來舉例。把引擎從車中分離出來是明顯可行的。我們可以單獨構建引擎,把它用到各種車上,更別提還有其他優勢。但我們不能說引擎是(is-a)一輛車。順口說出來我們就覺得不對(因為我們在為真實世界的系統建模,這正是我們想要的效果)。我們最好用has-a術語來描述組合關系。車有(has-a)引擎。
1.11.2 has-a關系
我們之前已經討論過了繼承關系是is-a關系的原因,而組合關系可以稱為has-a關系。我們可以使用上一小節中的例子,電視有(has-a)開關和顯示屏。電視顯而易見不是一個開關,所以兩者沒有繼承關系。同樣,計算機有(has-a)顯卡,有(has-a)鍵盤,有(has-a)光驅。第7章深入講解繼承和組合這兩個主題以及相互之間的關系。
總結
以上是生活随笔為你收集整理的《面向对象的思考过程(原书第4版)》一1.11 组合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Java线程与并发编程实践》—— 2.
- 下一篇: 《移动App测试的22条军规》—第1章1