继承和组合
继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。
组合是一种has-a的关系。逻辑上A是B的“一部分”(a part of),但是不允许B从A派生,而是要用A和其它东西组合出B
优先使用对象组合,而不是类继承 。
继承优点:继承允许根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-boxreuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。容易进行新的实现,因为其大多数可继承而来。 易于修改或扩展那些被复用的实现。
优点:
1.支持扩展,通过继承父类实现,但会使系统结构较复杂
2. 易于修改或扩展被复用的代码
继承缺点:继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。当父类的实现更改时,子类也不得不会随之更改。
缺点:
1.代码白盒复用,父类的实现细节暴露给子类,破坏了封装性
2.当父类的实现代码修改时,可能使得子类也不得不修改,增加维护难度。
3.子类缺乏独立性,依赖于父类,耦合度较高
4.不支持动态拓展,在编译期就决定了父类
组合优点:对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse),因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。 组合类之间没有很强的依赖关系,被包含对象与容器对象之间的依赖关系比较少,优先使用对象组合有助于保持每个类被封装。组合的耦合度低,代码维护性好。通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义组合。
优点:
1.代码黑盒复用,被包括的对象内部实现细节对外不可见,封装性好。
2.整体类与局部类之间松耦合,相互独立。
3.支持扩展
4.每个类只专注于一项任务
5.支持动态扩展,可在运行时根据具体对象选择不同类型的组合对象(扩展性比继承好)
组合缺点 :
缺点:
1.创建整体类对象时,需要创建所有局部类对象。导致系统对象很多。