2011-11-08 89 views
0
class B extends A 

這段代碼B類可以使用變量和類A的方法繼承和組成之間的區別?

class B 
{ 
    A a=new A(); 
} 

現在,我們還可以用在B級變量和類的方法的使用對象

所以我問題是這樣的----爲什麼我們用這兩種不同的方式來使用其他類的屬性(根據變量和方法)..

+2

沒有時間獲得完整答案,但您要找的是[繼承vs構圖](https://www.google.com/search?q=inheritance+vs+composition)。另請參閱[繼承和組合之間的區別](http://stackoverflow.com/questions/2399544/difference-between-inheritance-and-composition)。 –

回答

1

我覺得B類擴展A介紹某種類,你可以使用A的方法,B中的變量,即使你不知道A;而且它是在面向對象的設計方面更加美麗。

+1

**美麗**絕對不是一個有效的說法,並且可能是客觀的。它還引入了許多額外的問題,正確的設計。 – ZenMaster

+0

「如果你不知道A」的意思是什麼。你可以解釋一下 – SilentBomb

+0

A < - B < - C,你可以在C中使用A和B的所有方法,你不需要知道哪個方法在A中,哪個方法在B中,並且相應地調用它們。 –

4

第二種方法稱爲代表團。還有組合物 - 當AB成員。

兩者之間的區別是,如果A是不是在同一個包B(包訪問是一個不同的情況下 - 留給讀者做練習) - 然後在代表團組成的情況下你會只能訪問公共數據成員和類別A的方法,而在繼承的情況下,繼承類B將有權訪問公共和受保護的成員和類A的方法。

更新

有很多即使在的A所有方法和成員都B訪問的情況下(其中大部分涉及這樣的情況:你是不是這兩個類的所有者的其他差異,而是當第三方向您提供A,而您無法控制其訪問修飾符時)。

但即使您確實有控制權並且可以將A的所有成員和方法定義爲public - 您想要嗎?這將引入額外的維護問題部落 - 最重要的,IMO,是什麼定義爲公共是你和你的代碼的用戶之間的合同 - 也許有人在地球的不同部分。這反過來又意味着你無法從他身上隱藏實現細節,您的私人實用方法或任何東西 - 沒有什麼能夠阻止他使用的一些方法,你只對一些內部計算寫道,直接。

這也就意味着 - 明天,當你決定,你不希望再次或維持這種方法它引入某種性能或安全性問題的 - 你無法將其刪除。 有人已經使用它。

另一個更新

如下文所述,有什麼東西,我沒有在繼承的情況下,你還收到了「免費贈送」中提到, - 多態性See here.

+0

我喜歡你解釋的方式,但是對於同樣的事情,這兩種方式的結果都是一樣的。但是如果A類和B類都在同一個包中並聲明爲public,那麼將會有什麼區別。\ – SilentBomb

+0

要繼承您也可以在使用A型的任何地方使用B型。在所示的第二個示例中,即使它包含A類型的對象,但它不能用於對象A可用於的所有對象,這會違背繼承的目的。 – Toast

1

一個明顯的區別是壓倒一切的A級定義的函數

想象一下,你有一個定義的10種功能,並要覆蓋只是其中之一。然後,如果你使用繼承,你只覆蓋那個繼承,並且仍然可以調用全部10.使用另一種方法,除非你重新實現它們,否則你不能調用任何繼承。 (或者讓a公開並直接調用它,但這是違反封裝的)。

1

第一個例子是繼承,而第二個例子是組合。

當B是比A更特殊的實體時,繼承最好代表「是」的關係。例如,汽車是一種交通工具。繼承爲您提供超級類的所有公共和受保護的方法和變量。因此,子類應該對每個繼承特徵進行邏輯實現。例如,車輛可以具有顏色,因此所有車輛也必須具有顏色。

當A是B的子組件時,組合最能代表「有」關係。例如,一輛汽車有一個引擎。它們不是真正的另一個超集,它們是完全不同的類。但汽車必須使用發動機來執行。他們不太可能會分享許多方法和變量,所以繼承會很尷尬。想象一下,汽車類必須實施或揭露許多具體引擎細節的方法,例如油位和溫度。汽車對象不應該公開所有這些方法來簡單地... drive()。

1

第一個示例是is-a關係的示例。 class B將是class A的擴展,並且包含所有class A的公共成員,並且也可以訪問受保護的成員(在第二個示例中,您不會這樣做)。這也允許您將源自class A的對象組合在一起(包括class A的類型),使用任何重寫方法啓用多態。這是第二個例子不允許你做的另一件事,請覆蓋class A中定義的方法,以使它們更適合於class B。如果你想繼承從一個類的行爲,你會這樣做。

第二個例子是has-a的關係。例如,在您可能有class Parent,其中具有一個class Child的情況下,您可以使用它。

有很多書籍/指南/文檔可以爲您提供每個選項的差異和優勢,並且最適合特定場景。

編輯:我花了太長時間發佈,如果你搜索「是 - 一個」和「有一個」的關係,你會發現很多信息。