8

投资组合 A → 基金 1

投资组合 A → 基金 2

投资组合 A → 基金 3

如果不使用 is/has,我无法构筑我的句子。但在 1 和 2 之间,

1)有一个:

class PortfolioA
{
    List<Fund> obj;
}

2)是一个:

class PortfolioA : List<Fund>
{

}

从可扩展性和可用性的角度来看,您认为哪一个更好?我仍然可以通过任何一种方式访问​​我的资金,尽管有一点语法上的改变。

4

8 回答 8

17

我与其他认为 HAS-A 在这种情况下更好的人一起投票。你在评论中问:

当我说投资组合只是资金的集合,具有自己的一些属性,如 TotalPortfolio 等,这从根本上不会成为“is-a”吗?

我不这么认为。如果您说PortfolioIS-A List<Fund>,那么 Portfolio 的其他属性呢?当然,您可以向此类添加属性,但是将这些属性建模为 List 的属性是否准确?因为这基本上就是你正在做的事情。

此外,如果一个产品组合需要支持多个产品List<Fund>怎么办?例如,您可能有一个显示当前投资余额的列表,但另一个显示如何投资新贡献的列表。而当资金停产,用一套新的资金来接替它们时呢?历史信息有助于跟踪,以及当前的资金分配。

关键是所有这些属性都不是列表的正确属性,尽管它们可能是投资组合的属性。

于 2008-11-04T21:03:21.843 回答
8

不要“总是”支持组合或继承,反之亦然;它们具有不同的语义(含义);仔细查看含义,然后决定 - 一个是否比另一个“更容易”并不重要,对于长寿而言,正确的语义很重要

记住:is-a = 类型,has-a = 包含

所以在这种情况下,投资组合逻辑上是资金的集合;投资组合本身不是一种基金所以组合是正确的关系

编辑:我最初误读了这个问题,但答案仍然是一样的。投资组合不是一种列表,它是具有自己属性的不同实体。例如,投资组合是具有初始投资成本、总现值、随时间变化的价值历史等的金融工具的集合,而列表是对象的简单集合。投资组合只是最抽象意义上的“列表类型”。

编辑 2:考虑投资组合的定义 - 它无一例外地被描述为事物的集合。艺术家的作品集是他们作品的集合,网页设计师的作品集是他们网站的集合,投资者的作品集包括他们拥有的所有金融工具,等等。很明显,我们需要一个列表(或某种列表)来表示投资组合,但这绝不意味着投资组合是一种列表!

假设我们决定让 Portfolio 从 List 继承。这一直有效,直到我们将股票、债券或贵金属添加到投资组合中,然后突然不正确的继承不再有效。或者假设我们被要求为比尔盖茨的投资组合建模,并发现 List 将耗尽内存 ;-) 更现实的是,在未来的重构之后,我们可能会发现我们应该从像 Asset 这样的基类继承,但是如果我们已经从 List 继承了,那么我们不能。

总结:区分我们选择表示一个概念的数据结构,以及概念本身的语义(类型层次结构)。

于 2008-11-04T20:49:07.597 回答
7

第一个,因为你应该尽可能地支持组合而不是继承。

于 2008-11-04T20:46:14.717 回答
4

这取决于企业是否将投资组合定义为一组(并且只是一组)基金。如果它甚至极有可能包含其他对象,比如“财产”,那么选择选项 1。如果一组基金与投资组合的概念之间存在很强的联系,则选择选项 2。

就可扩展性和实用性而言,1 比 2 稍有优势。我真的不同意您应该始终偏爱一个而不是另一个的概念。这实际上取决于实际的现实生活概念是什么。请记住,您总是可以^重构。

^ 对于总是的大多数情况。如果是公开的,那显然不是。

于 2008-11-04T20:53:44.903 回答
2

我会选择选项(1) - 组合,因为您最终可能具有特定于投资组合而不是基金的属性。

于 2008-11-04T20:46:50.517 回答
2

第一个,因为它是“由”组成的。=> 作文

于 2008-11-04T20:48:29.033 回答
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]; } }

等等等等

如果您希望能够使用相关语法将 Portfolio 类型的变量视为资金集合,那么这是更好的方法。

Portfolio BobsPortfolio = new Portfolio(Bob); 

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

或类似的东西

于 2008-11-04T21:58:59.513 回答
0

IS-A 关系船代表继承,HAS-A 关系船代表组合。对于上述场景,我们更喜欢组合,因为 PortfolioA 有一个列表,它不是列表类型。当 Portfolio A 是 List 类型时使用继承,但此处不是。因此,对于这种情况,我们应该更喜欢组合。

于 2017-08-08T08:48:20.300 回答