組合A - >基金1「是」vs「有」:哪個更好?
組合A - >基金2
組合A - >基金3
我不能幀我的句子沒有未使用的/有。但1 & 2之間,
1)具有:
class PortfolioA
{
List<Fund> obj;
}
2)是:
class PortfolioA : List<Fund>
{
}
哪一個你認爲是從可擴展性,易用性的好點?儘管語法變化很小,但我仍然可以使用我的資金。
組合A - >基金1「是」vs「有」:哪個更好?
組合A - >基金2
組合A - >基金3
我不能幀我的句子沒有未使用的/有。但1 & 2之間,
1)具有:
class PortfolioA
{
List<Fund> obj;
}
2)是:
class PortfolioA : List<Fund>
{
}
哪一個你認爲是從可擴展性,易用性的好點?儘管語法變化很小,但我仍然可以使用我的資金。
我和其他認爲HAS-A在這種情況下更好的人一起投票。你問的評論:
當我說,一個投資組合只是一個 集合資金,用自己的喜歡 TotalPortfolio等,這是否 根本不能成爲少數 屬性的「是一個「?
我不這麼認爲。如果您說Portfolio
IS-A List<Fund>
,那麼Portfolio的其他屬性呢?當然,你可以爲這個類添加屬性,但是將這些屬性建模爲List的屬性是準確的嗎?因爲這基本上就是你在做什麼。
另外如果一個投資組合需要支持多個List<Fund>
?例如,您可能有一個列表顯示當前的投資餘額,但另一個列表顯示新投入的投入。那麼什麼時候資金停止使用,並且用一組新資金來繼承他們?歷史信息對跟蹤以及當前的資金分配很有用。
問題是所有這些屬性都不是列表的正確屬性,儘管它們可能是投資組合的屬性。
第一個問題,因爲你應該儘量支持構圖而不是繼承。
您能證明該聲明嗎? – Blorgbeard 2008-11-04 20:56:33
我不會這樣說。 – 2008-11-04 21:21:21
他是對的,只要你可以。也許並不總是如此,但它總是比較好,除非它毫不費力。谷歌「擴展是邪惡的」更多信息。 – 2008-11-04 21:36:27
我會選擇(1) - 組成,因爲您最終可能擁有特定於投資組合的屬性,而不是基金。
第一個,因爲它是「由」組成。 =>構圖
不「總是」青睞構圖或繼承,反之亦然;他們有不同的語義(含義);仔細看看意思,然後決定 - 如果一個人比另一個人'容易'沒關係,因爲長壽很重要,你得到的語義是正確的
記住:is-a = type,has-a =遏制
所以在這種情況下,投資組合在邏輯上是一個基金的集合;投資組合本身是不是型基金的,所以成分是正確的關係
編輯:我誤解了問題本來,但答案還是一樣。投資組合不是一種列表,它是一個獨立的實體,擁有自己的屬性。例如,投資組合是具有初始投資成本,當前總價值,歷史價值歷史等的金融工具的總和,而List是對象的簡單集合。只有在最抽象的意義上,投資組合纔是一種「列表類型」。
編輯2:想想投資組合的定義 - 它無一例外地被定義爲事物的集合。藝術家的作品集是他們作品的集合,網頁設計師的作品集是他們網站的集合,投資者的作品集包括他們擁有的所有金融工具等等。很顯然,我們需要一個列表(或某種)來表示投資組合,但這並不意味着投資組合就是一種列表!
假設我們決定讓Portfolio繼承List。直到我們向投資組合中添加股票或債券或貴金屬,然後突然不正確的繼承不再有效。或者假設我們要模擬Bill Gates的投資組合,並發現List將耗盡內存;-)更現實的說,在未來的重構之後,我們可能會發現我們應該繼承像Asset這樣的基類,但是如果我們已經從List繼承,然後我們不能。摘要:區分我們選擇代表概念的數據結構,以及概念本身的語義(類型層次結構)。
這取決於企業是否將投資組合定義爲一個組(僅有一組)資金。如果甚至有可能包含其他對象的遠程可能性,比如說「財產」,那麼就去選擇1.如果在一組基金和投資組合之間存在強有力的聯繫,那麼選擇2。
只要可擴展性和有用性1比2略有優勢我真的不同意這個概念,你應該永遠支持一個。這實際上取決於實際的真實生活概念。請記住,你可以隨時^重構。
^對於大多數情況下永遠。如果它公開曝光,那顯然不是。
我會與看似常見的意見不同。在這種情況下,我認爲一個投資組合比資金更集合很少......通過繼承您允許使用多個構造,如在
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();
}
或類似的東西
IS-A關係船表示繼承和HAS-A關係船表示組合物。對於上面提到的場景,我們更喜歡構圖,因爲PortfolioA有一個List,它不是List類型。組合A是List類型時使用繼承,但這裏不是。因此對於這種情況我們應該更喜歡組合。
另請參閱[prefer-composition-over-inheritance?](http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance?rq=1) – nawfal 2013-10-03 11:07:48