首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

复合优先于沿袭

2012-10-10 
复合优先于继承继承是代码重用的有力武器,但是它并不是完成这项工作的最佳工具,不适当的使用继承会导致脆

复合优先于继承
继承是代码重用的有力武器,但是它并不是完成这项工作的最佳工具,不适当的使用继承会导致脆弱的软件,在

一个包内部使用继承是非常安全的,子类和超类的实现在同一个程序员的控制之下,对于专门为了继承而设计并且

具有很好文档说明的类,使用继承也很安全。然而,对普通的具体类进行跨越包边界的继承则是非常危险的。
    1,与方法调用不同,继承打破了封装性。 
      一个子类依赖于超类中特定功能的实现细节,超类的实现有可能随着发行版本的不同而变化,如果真的发生了

变化,子类可能被打破。造成子类脆弱的另一个原因是,它们的超类在后续版本中可以获得新的方法,而这个新的

方法的名字有可能与子类的方法有共同的签名,这样就会产生覆盖或重载。
    2,只有当子类真正是超类的"子类型"的时候,继承才是合适的。换句话说,对于两个类A和B,只有当两者之间

确实存在"is-a"关系的时候,类B才应该扩展类A。如果你打算让类B扩展类A,那么你应该问自己:"每一个B确实也

是A么?"如果你不能确定这个问题的答案是yes,那么B就不应该扩展A。 
    总之,继承机制的功能非常强大,但是它存在许多问题,因为它违背了封装原则,只有当子类和超类之间确实存

在子类型关系时,使用继承才是合适的。即便如此,如果子类和超类在不同的包中,并且超类不是为了扩展而设计

的,那么继承将会导致脆弱性,为了避免这种脆弱性,可以用复合和转发机制来代替继承,尤其是当存在一个适当

的接口来实现一个包装类的时候。

热点排行