2008-11-04 90 views
8

組合A - >基金1「是」vs「有」:哪個更好?

組合A - >基金2

組合A - >基金3

我不能幀我的句子沒有未使用的/有。但1 & 2之間,

1)具有:

class PortfolioA 
{ 
    List<Fund> obj; 
} 

2)是:

class PortfolioA : List<Fund> 
{ 

} 

哪一個你認爲是從可擴展性,易用性的好點?儘管語法變化很小,但我仍然可以使用我的資金。

+1

另請參閱[prefer-composition-over-inheritance?](http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance?rq=1) – nawfal 2013-10-03 11:07:48

回答

15

我和其他認爲HAS-A在這種情況下更好的人一起投票。你問的評論:

當我說,一個投資組合只是一個 集合資金,用自己的喜歡 TotalPortfolio等,這是否 根本不能成爲少數 屬性的「是一個「?

我不這麼認爲。如果您說Portfolio IS-A List<Fund>,那麼Portfolio的其他屬性呢?當然,你可以爲這個類添加屬性,但是將這些屬性建模爲List的屬性是準確的嗎?因爲這基本上就是你在做什麼。

另外如果一個投資組合需要支持多個List<Fund>?例如,您可能有一個列表顯示當前的投資餘額,但另一個列表顯示新投入的投入。那麼什麼時候資金停止使用,並且用一組新資金來繼承他們?歷史信息對跟蹤以及當前的資金分配很有用。

問題是所有這些屬性都不是列表的正確屬性,儘管它們可能是投資組合的屬性。

7

第一個問題,因爲你應該儘量支持構圖而不是繼承。

+4

您能證明該聲明嗎? – Blorgbeard 2008-11-04 20:56:33

+0

我不會這樣說。 – 2008-11-04 21:21:21

+1

他是對的,只要你可以。也許並不總是如此,但它總是比較好,除非它毫不費力。谷歌「擴展是邪惡的」更多信息。 – 2008-11-04 21:36:27

2

我會選擇(1) - 組成,因爲您最終可能擁有特定於投資組合的屬性,而不是基金。

2

第一個,因爲它是「由」組成。 =>構圖

8

不「總是」青睞構圖或繼承,反之亦然;他們有不同的語義(含義);仔細看看意思,然後決定 - 如果一個人比另一個人'容易'沒關係,因爲長壽很重要,你得到的語義是正確的

記住:is-a = type,has-a =遏制

所以在這種情況下,投資組合在邏輯上是一個基金的集合;投資組合本身是不是型基金,所以成分是正確的關係

編輯:我誤解了問題本來,但答案還是一樣。投資組合不是一種列表,它是一個獨立的實體,擁有自己的屬性。例如,投資組合是具有初始投資成本,當前總價值,歷史價值歷史等的金融工具的總和,而List是對象的簡單集合。只有在最抽象的意義上,投資組合纔是一種「列表類型」。

編輯2:想想投資組合的定義 - 它無一例外地被定義爲事物的集合。藝術家的作品集是他們作品的集合,網頁設計師的作品集是他們網站的集合,投資者的作品集包括他們擁有的所有金融工具等等。很顯然,我們需要一個列表(或某種)來表示投資組合,但這並不意味着投資組合就是一種列表!

假設我們決定讓Portfolio繼承List。直到我們向投資組合中添加股票或債券或貴金屬,然後突然不正確的繼承不再有效。或者假設我們要模擬Bill Gates的投資組合,並發現List將耗盡內存;-)更現實的說,在未來的重構之後,我們可能會發現我們應該繼承像Asset這樣的基類,但是如果我們已經從List繼承,然後我們不能。摘要:區分我們選擇代表概念的數據結構,以及概念本身的語義(類型層次結構)。

4

這取決於企業是否將投資組合定義爲一個組(僅有一組)資金。如果甚至有可能包含其他對象的遠程可能性,比如說「財產」,那麼就去選擇1.如果在一組基金和投資組合之間存在強有力的聯繫,那麼選擇2。

只要可擴展性和有用性1比2略有優勢我真的不同意這個概念,你應該永遠支持一個。這實際上取決於實際的真實生活概念。請記住,你可以隨時^重構。

^對於大多數情況下永遠。如果它公開曝光,那顯然不是。

1

我會與看似常見的意見不同。在這種情況下,我認爲一個投資組合比資金更集合很少......通過繼承您允許使用多個構造,如在

public Portfolio(CLient client) {}; 
public Portfolio(Branch branch, bool Active, decimal valueThreshold) 
{ 
    // code to populate collection with all active portfolios at the specified branch whose total vlaue exceeds specified threshold 
} 

和索引,如:

public Fund this[int fundId] { get { return this.fundList[fundId]; } } 

etc.等

如果你想能夠把類型投資組合的變量作爲一個基金的集合,與相關的語法,那麼這是更好的方法。

Portfolio BobsPortfolio = new Portfolio(Bob); 

foreach (Fund fund in BobsPortfolio) 
{ 
    fund.SendStatement(); 
} 

或類似的東西

0

IS-A關係船表示繼承和HAS-A關係船表示組合物。對於上面提到的場景,我們更喜歡構圖,因爲PortfolioA有一個List,它不是List類型。組合A是List類型時使用繼承,但這裏不是。因此對於這種情況我們應該更喜歡組合。