里氏替代原则

继承的优缺点

在面向对象的语言中, 继承是必不可少的、 非常优秀的语言机制

优点:
  • 代码共享, 减少创建类的工作量, 每个子类都拥有父类的方法和属性;
  • 提高代码的重用性;
  • 子类可以形似父类, 但又异于父类, “龙生龙, 凤生凤, 老鼠生来会打洞”是说子拥有父的“种”, “世界上没有两片完全相同的叶子”是指明子与父的不同;
  • 提高代码的可扩展性, 实现父类的方法就可以“为所欲为”了, 君不见很多开源框架的扩展接口都是通过继承父类来完成的;
  • 提高产品或项目的开放性。
缺点:
  • 继承是侵入性的。 只要继承, 就必须拥有父类的所有属性和方法;
  • 降低代码的灵活性。 子类必须拥有父类的属性和方法, 让子类自由的世界中多了些约束;
  • 增强了耦合性。 当父类的常量、 变量和方法被修改时, 需要考虑子类的修改, 而且在缺乏规范的环境下, 这种修改可能带来非常糟糕的结果——大段的代码需要重构

里氏替换原则的含义

里氏替换原则为良好的继承定义了一个规范, 一句简单的定义包含了4层含义

  1. 子类必须完全实现父类的方法
  2. 子类可以有自己的个性
  3. 覆盖或实现父类的方法时输入参数可以被放大(不能让他缩小,否则会引起问题)
  4. 覆写或实现父类的方法时输出结果可以被缩小

总结

里氏替换要求:

  • 如果要重写,子类的返回值类型一定要小于等于父类的返回值类型
  • 如果要重载,要保证子类的方法一定不会被调用,具体实现是让子类的方法参数类型大于等于父类的参数类型

采用里氏替换原则的目的就是增强程序的健壮性, 版本升级时也可以保持非常好的兼容性

最佳实践

  • 在项目中, 采用里氏替换原则时, 尽量避免子类的“个性”, 一旦子类有“个性”, 这个子类和父类之间的关系就很难调和了, 把子类当做父类使用, 子类的“个性”被抹杀——委屈了点; 把子类单独作为一个业务来使用, 则会让代码间的耦合关系变得扑朔迷离——缺乏类替换的标准。

参考:设计模式之禅

转载于:https://my.oschina.net/u/3426908/blog/879427

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值