导语:####
我们在职业生涯中,经常会听到同行的大牛说:“要针对接口编程,而不是针对实现编程”;“优先使用组合而不是继承”。那么今天我就来谈谈对象组合与继承。
- 继承和组合是什么
- 继承的优缺点
- 组合的优缺点
继承和组合是什么
类继承或子类化让我们可以使用其它类来定义类的实现(使用superClass来定义subClass的实现)。子类化常常被称为白箱复用(white-box reuse),因为superClass的内部描述与细节通常对子类可见。
对象组合要求被组合的对象具有良好的接口,并且通过从其他对象得到的引用在运行时运态定义。所以可以将对象组合到其他对象中,以构建更加复杂的功能。由于对象的内部细节对其他对象不可见,它们看上去为“黑箱”,这种类型的复用称为黑箱复用(black-box reuse)。
这就是我们常说的白箱复用和黑箱复用。
继承的优缺点
那么使用类继承或子类化都有些什么优缺点呢:
优点: 1,类继承简单粗爆,直观,关系在编译时静态定义。
2,被复用的实现易于修改,sub可以覆盖super的实现。
缺点:1,无法在运行时变更从super继承来的实现(也不一定是缺点)
2,sub的部分实现通常定义在super中。
3,sub直接面对super的实现细节,因此破坏了封装。
4,super实现的任何变更都会强制子类也进行变更,因为它们的实现联系在了一起。
5,如果在新的问题场景下继承来的实现已过时或不适用,所以必须重写super或继承来的实现。
由于在类继承中,实现的依存关系,对子类进行复用可能会有问题。有一个解决办法是,只从协议或抽象基类继承(子类型化),国为它们只对很少的实现,而协议则没有实现。
组合的优缺点
对象组合让我们同时使用多个对象,而每个对象都假定其他对象的接口正常运行。因此,为了在系统中正常运行,它们的接口都需要经过精心的设计。下面我就来说说他的优缺点
优点:1,不会破坏封装,因为只通过接口来访问对象;
2,减少实现的依存关系,因为实面是通过接口来定义的;
3,可以在运行时将任意对象替换为其他同类型的对象;
4,可以保持类的封装以专注于单一任务;
5,类和他的层次结构能保持简洁,不至于过度膨胀而无法管理;
缺点:1,涉及对象多;
2,系统的行为将依赖于不同对象间的关系,而不是定义于单个类中;
3,现成的组件总是不太够用,从而导致我们要不停的定义新对象。
结语:
尽管有以上缺点,对象组合仍然对系统设计有很多好处。我们可以通过在一些部分用类继承来克服这些缺点,使得利用已有组件创建新的组件较为容易。当然,该用类继承时 还是用类继承吧
网友评论