复合优先于继承

本文深入探讨了继承作为代码重用工具的双刃剑特性,强调了其在不同场景下的适用性和潜在风险。文章指出,继承在包内使用时较为安全,但在跨包边界时可能导致封装性破坏、子类脆弱性增加等问题。通过对比方法调用与继承的区别,文章进一步解释了选择合适继承时机的重要性,并提出了复合和转发机制作为替代方案。最后,文章强调了理解继承机制背后的原则,以避免在实际应用中引入不必要的脆弱性和复杂性。
继承是代码重用的有力武器,但是它并不是完成这项工作的最佳工具,不适当的使用继承会导致脆弱的软件,在

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

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

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

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

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

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

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

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

的接口来实现一个包装类的时候。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值