所以我一直在学习作文和继承。现在我理解继承是一种“is-a”类型的关系,而组合是一种“有一种”的关系。但这是否意味着一个组合只是指一个具有某种东西的对象(或领域)的类?
答案 0 :(得分:1)
如果某个类可以扩展另一个类(继承),或者使用另一个类作为字段(组合),那就去组合,因为它允许您稍后更改实现,而不会影响使用您的类的任何代码。
如果不这样做,则永远将实现锁定为扩展类的子类。你这么做的时候,这很糟糕。
JDK中选择继承而不是组合的示例是Properties
类,扩展 Hashtable
,当所有需要使用Hashtable
时在内部并实现合适的接口。这意味着您不能在自己的Properties类实现中替换,例如使用简单的匿名类。
JDK中有更多的例子,他们说得对,例如HashMap
使用一个Hashtable
,但很容易被改为使用其他一些哈希 - 基于类而不影响其合同或API。
你应该始终努力使课程的实施变得灵活 见Liskov substitution principle
答案 1 :(得分:1)
基本上是的,但它有更多含义。
外部对象必须保护所包含的对象免受修改,以避免数据损坏。这通常是通过防御性副本创建来完成的。如果封闭的对象是不可变的,那么这不是必需的
其他含义是将封闭对象与对象API隔离,以便将来可能会更改。假设对象使用数组然后决定使用列表,通过禁止对内部对象的引用,外部可以在不破坏现有客户端的情况下更改实现。
您可以在“有效Java书”中查看章节:“首选组合而不是继承”,其中详细介绍了这些以及其他许多含义。