0

所以一直在学习组合和继承。现在我明白继承是一种“is-a”类型的关系,而组合是一种“has-a”的关系。但这是否意味着组合只是指具有某物的对象(或字段)的类?

4

2 回答 2

1

当您遇到一个类可以扩展另一个类(继承)或使用另一个类作为字段(组合)的情况时,请使用组合,因为它允许您稍后更改实现而不影响使用您的类的任何代码。

如果不这样做,您将永远将实现锁定为扩展类的子类。任何时候你这样做,都是不好的。

JDK 中选择继承而不是组合的一个例子是Properties类,它extends Hashtable,而所有需要的是在Hashtable内部使用 a 并实现合适的接口。这意味着您不能在您自己的 Properties 类实现中替代,例如用一个简单的匿名类。

JDK 中有更多示例正确,例如HashMap 使用a Hashtable,但可以很容易地更改为使用其他基于哈希的类,而不会影响其合同或 API。

您应该始终努力使类的实现灵活。
参见Liskov 替换原则

于 2013-10-07T21:37:13.637 回答
1

基本上是的,但它有更多的含义。

外部对象必须保护封闭对象不被修改以避免数据损坏。这通常是通过创建防御性副本来完成的。如果封闭的对象是不可变的,则没有必要

其他含义是使封闭对象与对象 API 隔离,因此它可能在未来发生变化。假设对象使用一个数组,然后它决定使用一个列表来代替,通过禁止对内部对象的引用,外部可以在不破坏现有客户端的情况下更改实现。

您可以查看“Effective Java Book”中的“Prefer composition over inheritance”一章,其中详细描述了这些和许多其他含义。

于 2013-10-07T21:55:07.550 回答