`
javawebsoa
  • 浏览: 409324 次
社区版块
存档分类
最新评论

Java学习笔记:(16)复合优先于继承

 
阅读更多

继承是实现代码重用的有力手段,但它并非永远是完成这项工作的最佳工具。使用不当会导致软件变得很脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处在同一个程序员的控制之下。

与方法调用不同的是,继承打破了封装性。换句话说,子类依赖于其超类中特定功能的实现细节。


幸运的是,有一种办法可以避免前面提到的所有问题。不用扩展现有类,而是在新的类中增加一个私有域,它引用现有类的一个实例。这种设计被称做“复合”,因为现有的类成了新类的一个组件。新类中的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回它的结果。这被成为转发(forwarding)。



简而言之,继承的功能非常强大,但是也存在许多问题,因为它违背了封装原则。只有当子类和超类之间确实存在子类型关系时,使用继承才是恰当的。即便如此,如果子类和超类处在不同的包中,并且超类并不是为了继承而设计的,那么继承将会导致脆弱性。为了避免这种脆弱性,可以用复合和转发机制来代替继承,尤其是当存在适当的接口可以实现包装类的时候。包装类不仅比子类更加健壮,而且功能也更加强大。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics