Java编程思想——到底选择合成还是继承
無(wú)論合成還是繼承,都允許我們將子對(duì)象置于自己的新類(lèi)中。大家或許會(huì)奇怪兩者間的差異,以及到底該如何選擇。 如果想利用新類(lèi)內(nèi)部一個(gè)現(xiàn)有類(lèi)的特性,而不想使用它的接口,通常應(yīng)選擇合成。也就是說(shuō),我們可嵌入一個(gè)對(duì)象,使自己能用它實(shí)現(xiàn)新類(lèi)的特性。但新類(lèi)的用戶(hù)會(huì)看到我們已定義的接口,而不是來(lái)自嵌入對(duì)象的接口??紤]到這種效果,我們需在新類(lèi)里嵌入現(xiàn)有類(lèi)的private對(duì)象。
有些時(shí)候,我們想讓類(lèi)用戶(hù)直接訪(fǎng)問(wèn)新類(lèi)的合成。也就是說(shuō),需要將成員對(duì)象的屬性變?yōu)閜ublic。成員對(duì)象會(huì)將自身隱藏起來(lái),所以這是一種安全的做法。而且在用戶(hù)知道我們準(zhǔn)備合成一系列組件時(shí),接口就更容易理解。car(汽車(chē))對(duì)象便是一個(gè)很好的例子:
//: Car.java // Composition with public objectsclass Engine {public void start() {}public void rev() {}public void stop() {} }class Wheel {public void inflate(int psi) {} }class Window {public void rollup() {}public void rolldown() {} }class Door {public Window window = new Window();public void open() {}public void close() {} }public class Car {public Engine engine = new Engine();public Wheel[] wheel = new Wheel[4];public Door left = new Door(),right = new Door(); // 2-doorCar() {for(int i = 0; i < 4; i++)wheel[i] = new Wheel();}public static void main(String[] args) {Car car = new Car();car.left.window.rollup();car.wheel[0].inflate(72);} } ///:~由于汽車(chē)的裝配是故障分析時(shí)需要考慮的一項(xiàng)因素(并非只是基礎(chǔ)設(shè)計(jì)簡(jiǎn)單的一部分),所以有助于客戶(hù)程序員理解如何使用類(lèi),而且類(lèi)創(chuàng)建者的編程復(fù)雜程度也會(huì)大幅度降低。
如選擇繼承,就需要取得一個(gè)現(xiàn)成的類(lèi),并制作它的一個(gè)特殊版本。通常,這意味著我們準(zhǔn)備使用一個(gè)常規(guī)用途的類(lèi),并根據(jù)特定的需求對(duì)其進(jìn)行定制。只需稍加想象,就知道自己不能用一個(gè)車(chē)輛對(duì)象來(lái)合成一輛汽車(chē)——汽車(chē)并不“包含”車(chē)輛;相反,它“屬于”車(chē)輛的一種類(lèi)別?!皩儆凇标P(guān)系是用繼承來(lái)表達(dá)的,而“包含”關(guān)系是用合成來(lái)表達(dá)的。
總結(jié)
以上是生活随笔為你收集整理的Java编程思想——到底选择合成还是继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Cloud Stream如
- 下一篇: Lucene实现全文检索的流程