HIT软件构造-继承(LSP)和委托(CRP)

目录

1.继承原则(LSP)

2.委托原则(CRP)


1.继承原则(LSP)

  1. 子类型必须继承父类的所有方法,可以增加方法,但是不能删除方法
  2. 子类型必须继承父类型所有的抽象方法
  3. 子类型重写的方法的返回值类型和父类一样,或者是是父类返回值类型的子类,如果类型一样,则子类的返回值范围更窄,更加具体(协变)
  4. 子类型重写的方法的参数类型必须和父类一样(这里没有什么继承关系),而且子类的参数必须比父类更加广泛(限制条件较小),能处理更多的情况(Java不承认逆变)
  5. 子类型只能抛出父类已经抛出的异常,或者抛出父类抛出异常的子类异常,也可以不抛出异常,也就是说子类抛出的异常比父类范围更小
  6. 子类的规约不能比父类弱(前置条件不能比父类强,后置条件不能比父类弱,不变性(RI)比父类更严格),也就是父类能做的,子类一定也能做
  7. 普通的方法(不是重写的),参数列表中是父类,参数调用时传入子类也是可行的

HIT软件构造-继承(LSP)和委托(CRP)

上面的例子看出:

  1. 子类满足相同的不变量(考虑子类增加的成员变量charge)
  2. 重写的方法 start 具有较弱的前提条件
  3. 重写的方法brake 具有更强的后置条件

特殊情况:

  1. 集合类对象,如果集合中的数据类型不同,则它们是不可能有父子继承关系的,比如ArrayList<Integer>和ArrayList<Number>是没有继承关系的。
  2. 但是如果数据类型相同,则是可能有继承关系的,如HashSet<Integer>是LinkedHashSet<Integer>的父类

                                      

HIT软件构造-继承(LSP)和委托(CRP)

2.委托原则(CRP)

委派/委托:一个对象请求另一个对象的功能,是另一种复用形式,并且,委托是优于继承的。委托发生在object层面,而继承发生在class层面

比如想实现一个普通类的比较方法,可以采用继承和委托两种方式,当子类只需要继承父类的一小部分方法时,使用委托是更方便的(不需要重写很多的方法)

继承 (实现了Comparable接口,并重写compareTo方法)

委托 (将Comparable接口委托成员变量,并在成员方法compareTo中调用它)

总结:尽量少用继承,用委托

有问题欢迎大家指出~

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91508 人正在系统学习中

来源:z.q.xiao

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月5日
下一篇 2021年6月5日

相关推荐