組合和繼承都允許在新的類中放置子物件,組合是顯式地這樣做,而繼承是隱式地做。
那兩者之間的區別是怎樣的呢?又該如何選擇呢?
很多人對組合理解地還不是很好,所以我們先來理解一下組合:
組合技術通常用於想在新類中使用現有類的功能而非它的介面這種情況。
以car物件舉例:
//composition with public objects.
package examplechapter7;
class engine
public void rev() {}
public void stop() {}
}class wheel
}class window
public void rolldown() {}
}class door
public void close() {}
}public class car
public static void main(string args)
} ///:~
可以明顯看出,這個例子的類:車,擁有發動機,門,窗等等部件,是一種所有關係。
那繼承呢?
在繼承的時候,使用某個現有類,並開發乙個它的特殊版本。通常,這意味著你在使用乙個通用類,並為了某種特殊需要而將其特殊化。
兩者的區別呢?
還是以car為例,略微想一下就會發現,用乙個「交通工具」來構成一部「car」是毫無意義的,因為car並不包含「交通工具,它僅僅是一種交通工具(is -a 的關係)
組合一般是將現有型別作為新型別底層實現的一部分來加以復用,而繼承復用的是介面。
所以總結來說,「is-a 」(是乙個)的關係是用繼承來表達的,而「has-a"(有乙個)的關係則是用組合來表達的。
儘管物件導向程式設計對繼承極力強調,但在開始乙個設計時,一般應優先選擇組合(或者可能是**),只在確實必要時才使用繼承。
到底是該用組合還是繼承,乙個最清晰的判斷方法就是問問自己是否需要從新類向基類進行向上轉型。
Java 繼承與組合的區別
根據網路上大家對繼承和組合的討論,我簡單總結以下幾點 1 組合 has a 關係可以顯式地獲得被包含類 繼承中稱為父類 的物件,而繼承 is a 則是隱式地獲得父類的物件,被包含類和父類對應,而組合外部類和子類對應。2 組合關係在執行期決定,而繼承關係在編譯期就已經決定了。3 組合是在組合類和被包含...
Java 繼承與組合的區別
根據網路上大家對繼承和組合的討論,我簡單總結以下幾點 1 組合 has a 關係可以顯式地獲得被包含類 繼承中稱為父類 的物件,而繼承 is a 則是隱式地獲得父類的物件,被包含類和父類對應,而組合外部類和子類對應。2 組合關係在執行期決定,而繼承關係在編譯期就已經決定了。3 組合是在組合類和被包含...
Java的繼承與組合
在軟體設計遵循的基本原則的有這麼一條這樣的原則 多用組合少用繼承!在物件導向的軟體設計中,對於類的擴充套件,首先想到的是使用類的繼承來實現,由子類繼承父類,從而完成對子類的功能擴充套件。繼承的好處是可以盡量讓相同的屬性或功能復用。但是隨著專案越來越大,需求不斷編號,繼承就會變得越來越臃腫,後期難以控...