所以一直在学习组合和继承。现在我明白继承是一种“is-a”类型的关系,而组合是一种“has-a”的关系。但这是否意味着组合只是指具有某物的对象(或字段)的类?
2 回答
当您遇到一个类可以扩展另一个类(继承)或使用另一个类作为字段(组合)的情况时,请使用组合,因为它允许您稍后更改实现而不影响使用您的类的任何代码。
如果不这样做,您将永远将实现锁定为扩展类的子类。任何时候你这样做,都是不好的。
JDK 中选择继承而不是组合的一个例子是Properties
类,它extends Hashtable
,而所有需要的是在Hashtable
内部使用 a 并实现合适的接口。这意味着您不能在您自己的 Properties 类实现中替代,例如用一个简单的匿名类。
JDK 中有更多示例正确,例如HashMap
使用a Hashtable
,但可以很容易地更改为使用其他基于哈希的类,而不会影响其合同或 API。
您应该始终努力使类的实现灵活。
参见Liskov 替换原则
基本上是的,但它有更多的含义。
外部对象必须保护封闭对象不被修改以避免数据损坏。这通常是通过创建防御性副本来完成的。如果封闭的对象是不可变的,则没有必要
其他含义是使封闭对象与对象 API 隔离,因此它可能在未来发生变化。假设对象使用一个数组,然后它决定使用一个列表来代替,通过禁止对内部对象的引用,外部可以在不破坏现有客户端的情况下更改实现。
您可以查看“Effective Java Book”中的“Prefer composition over inheritance”一章,其中详细描述了这些和许多其他含义。