5

在这个例子中,选项 2 相对于 1 的优点/缺点是什么?

选项 1(继承):

public class SalesList : List<Sales>
{
    //methods that add extra behavior List<Sales>
}

选项 2(作文):

public class SalesList 
{
    private List<Sales> _list;
    //methods that add extra behavior to List<Sales>
}
4

5 回答 5

2

选项 2 的优点是敏捷性。使用组合,您可以选择要公开的列表界面的哪些部分。

想象一下,稍后您决定不再从另一个类扩展。到目前为止,您的库的一些用户将使用 List 提供的方法,因此您需要自己实现所有列表方法:add/addAll/contains/retainAll。对于一个简单的销售清单,有很多方法可以实现。

基本上,这归结为 Joshua Bloch 在Bumper-Sticker API Design中谈到的“如有疑问,请忽略它” 。API 的每个方面都应该尽可能小,但不能更小。你以后可以随时添加东西,但你不能把它们拿走。

于 2010-04-06T17:53:06.637 回答
2

Composition 的主要缺点是,如果您需要呈现相同的接口,则需要包装(复制)私有 List 的所有公共方法,在 Inheritance 中您已经拥有所有这些方法,但您不能覆盖其中任何一个那是不可覆盖的(在 C# 中,这意味着该方法应该被标记为“虚拟”,在 Java 中它不能被标记为“最终”)。

在 C# 3 及更高版本中,您可以使用扩展方法,它提供了继承的外观,而不会真正弄乱层次结构树。

于 2010-04-06T17:56:40.280 回答
2

继承允许我们形成类的层次结构,这样父类是**集,其所有子类都是**集,这允许泛化、特化和应用替换原则

于 2012-10-12T11:38:38.803 回答
1

选项 1
- 优点 - 继承和重用的所有优点
- 缺点 - 代码现在向消费者发出信号,表明它来自 List。如果这需要在以后改变,那么所有相关的消费者都会受到影响。

选项 2
- 优点 - 关于存储销售数据的实现细节从消费者那里抽象出来。因此,如果实现需要更改(例如字典),类的使用者将不受这些更改的影响。
- 缺点 - SalesList 类现在需要公开其他方法来获取和/或设置到内部 _list 对象。这是需要维护的附加代码。此外,如果内部实现发生变化,您需要注意仍然支持以前的行为......

只是想到了一些想法。

HTH。

于 2010-04-06T17:53:45.340 回答
0

在组合中,您可以在运行时动态更改超类实现。但是使用继承你不能在运行时改变超类的实现。

在组合中,它取决于您传递给 setter 的对象类型,并且它将基于此行为。它将为实施提供更大的灵活性

于 2011-04-16T11:13:01.737 回答