继承:public继承是一种 is-a 的关系,也就是每一个派生类对象都有一个基类对象
这些关系都适合用继承来表达 ----> 继承了之后父类的成员就变成了子类的一部分,子类对象可以直接用
组合: 是一种has -a(有一个) 的关系,假设B组合了A,每个B对象中都有一个A对象
组合了之后不能直接用,间接用
组合C的公有我通过C对象可以直接用,C的保护我组合了之后不能直接用,D访问的时候,访问不了(相当于就是在C的类外访问了)
组合也是复用
一些类型的关系,既可以认为是is -a ,也可以认为是has - a
优先使用对象组合对象,而不是类继承
为什么要优先使用has -a 呢
继承允许你根据基类的实现来定义派生类的实现,这种通过生成派生类的复用通常被称为白箱复用
派生类和基类间的依赖关系很强,耦合度高
对象组合是类继承之外的另一种复用选择,新的更复杂的功能可以通过组装或组合来获得,对象组合要求被组合的对象具有良好定义的接口,这种复用风格被称为黑箱复用
组合类之间没有很强的依赖关系,耦合度低