本周重点是Liskov可替换原则。它要求父类和子类的行为一致性,子类要有更强的不变量、更弱的前置条件、更强的后置条件。在该原则的要求下,每个子类都可以对父类进行替换。这在开发过程中会带来极大的便利,在实验3中学习并运用该原则。

有关复用

1.复用的级别
-源代码级别的复用
-模块级别的复用(类/抽象类/接口)
-库级别的复用(API/包)
-系统级别的复用(框架)
2.软件构造过程中任何实体都可能被复用。比如需求、规约、数据、测试用例、文档等。
3.白盒复用对应继承,黑盒复用对应委托(显示委托:明确指出调用某个对象的功能;隐式委托:不明确指出调用某个对象的功能,例如敲击键盘)

子类型多态

客户端可用统一的方式处理不同类型的对象

协变和反协变

1.协变:子类型方法的返回值不变或者更加具体(原返回值的子类)、子类型抛出的异常不变或者更加具体(原异常类型的子类)

2.反协变:子类型方法的参数值不变或者更加抽象(原类型的父类),或者不抛出

但是对Java而言不支持,因为被视为overload
3.数组是协变的。Java不支持泛型数组,因为运行时存在泛型擦除。

Liskov可替换原则

(要求父类和子类的行为一致性)
-更强的不变量
-更弱的前置条件
-更强的后置条件

Java编译器有关继承的规则

-子类型可以增加方法,但是不能删除方法
-子类型需要实现抽象类型中的所有未实现方法
-子类型中重写的方法的 返回值 必须 相同/子类型/符合协变
-子类型中重写的方法的 参数 必须 相同/符合协变
-子类型中重写的方法不能抛出额外异常
A是父类,B是子类,A中有方法someMethod(Integer n),B中有方法someMethod(Number n)。如果A a = new B(),并且向someMethod传入Integer、Number,则分别调用哪个类的方法?
答:传入Integer类型调用A的方法,传入Number类型报错。

泛型中的LSP

1.ArrayList是List的子类型
List不是List的子类型
如果两个泛型存在父子类型关系,则泛型的类型必须相同。因为运行时存在泛型擦除。编译阶段报错,因为运行时进行擦除后相同

2.通配符可以解决泛型擦除问题,比如List<?>(说明任何类型都可用),用于和泛型的具体类型无关的场合,或者类型使用了Object类的操作,即放入什么类型都不影响使用。
3.<? super A>表示可存A和A的父类,<? extends A>表示可存A和A的子类。
例如,List是List<?>的子类型,同样是List<? extends Object>的子类型。List是List<? super String>的子类型。

委托和组合

1.建立委托之间的联系。

2.相较于继承,委托是比较细粒度的复用方式。一般来说,只需要用到一个类的部分而非全部方法时,使用委托。当一个对象需要“存在一个”或者“使用一个”,而不是“是一个”时使用委托。
3.不需要两个类之间存在语义联系。在实验2中,FriendshipGraph和Graph存在明显的父子类关系,可用继承。也可用委托。
4.委托发生在对象层面,继承发生在类的层面。
5.在计算奖金的例子中,核心问题是每个Employee对象的奖金计算方法都不同,在对象层面而非类层面。

6.动物例子。考虑动物的飞和叫。
将飞法设置一个接口,针对不同的飞法,实现该接口的多个类。叫法同理。然后将两个接口整合到鸭子的接口(用extends),再实现鸭子的类。最后继承该类实现种类细分。

具体实现(右下角的Duck最好修改为Ducklike,因为声明变量最好用父类)

7.委托的分类
委托分为使用(临时性)和关联(永久性)。
以下例子是临时性委托,只有执行方法时才产生关联

以下是永久性委托,将使用的类内化成属性,属于对象的一部分。又分为组合(调用类无法改变,更强的关联)和聚合(调用类可以改变,更弱的关联)

上为聚合,下为组合

软件构造学习笔记-第八周相关推荐

  1. 软件构造学习笔记-第三周

    本周介绍了软件开发的几种模型,并重点介绍了Git.Git是分布式版本控制系统,可以通过SSH key建立远程与本地的连接,通过Git Bash中的命令进行文件的上传和下载.对于这门课程,Git的主要作 ...

  2. 软件构造学习笔记-第十一周

    本周的内容是,比较各个设计模式的区别和联系,并介绍了状态模式和备忘录模式,以及正则表达式.正则表达式用于对文本文件的处理.在实验3中有一项要求是对输入文本进行解析,构造航班.要求表达式不仅要读入合法数 ...

  3. 软件构造学习笔记-第六周

    这周的重点是重载和重写.重载要求两方法的签名必须不同,而重写则要求两方法的签名必须相同.重载可以发生在同一个类中,也可以发生在父类和子类中:重写必须发生在父类和子类中.接口/抽象类不具有构造方法,只有 ...

  4. 软件构造学习笔记-第五周

    本周讲了AF.RI.Safety from rep exposure.spec等概念.这些是辅助程序设计的重要部分,需要在代码中以注释的形式体现,可以显著提高代码可读性,明确设计的目的.必须要养成写的 ...

  5. 软件构造学习笔记-第十三周

    本周内容较少,主要介绍了断言以及防御式编程.断言一般用于程序开发阶段,用以快速发现错误,而在程序正式版本中则较少使用断言.一般来说,程序员使用(输入)的数据可以使用断言检测合法性,而用户输入数据则采用 ...

  6. 软件构造学习笔记-第七周

    本周只有一节课,内容较少.对于不可变类型的相等比较,需要重写equals和hashCode方法,实现观察等价性.对于可变类型,不建议重写以上两方法,按照默认比较方式(比较内存地址)即可. 可变类型的相 ...

  7. 软件构造学习笔记-第九周、第十周

    因为本周五开始五一假期,所以只有一节软件构造课.因为内容还属于创建模式.结构模式.行为模式.将该堂课的内容整合到本博客中.本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发.维 ...

  8. 软件构造学习笔记(九)面向复用的软件构造技术

    目录链接 Part I What is Software Reuse? Part II How to measure "reusability"? Part III Levels ...

  9. 软件构造学习笔记ATD

    在面向对象的编程中,ADT的编写十分重要,与传统的c语言不同,面向对象的编程更加商业化一点,所以保密需要做好,有点商业机密的感觉.如何设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示,避 ...

最新文章

  1. 04_机器学习概述,什么是机器学习,应用场景,数据来源与类型,网上可用的数据集、常用数据集数据的结构组成、特征工程是什么、意义、特征抽取、sklearn特征抽取API、文本特征抽取(学习笔记)
  2. influx生产部署重要配置
  3. kafka php 0.8,php5.6 centos7 kafka0.8.1
  4. sharding-jdbc学习
  5. php 数组合并字符,PHP将字符串或数组合并到一个数组内方法
  6. React组件的state和props
  7. 如何分析及处理 Flink 反压?
  8. Euraka配置详解
  9. jQuery fadeIn淡入效果
  10. Centos安装beef
  11. 在虚拟机VirtualBox上安装苹果Mac OS X系统
  12. 为何现在欠钱的人,都不爱还钱,太气人了...
  13. 视频人像分割算法—C++推理(视频抠图 图片抠图)
  14. 计算机科学与生命科学的关系,计算机科学与生命科学论文
  15. 计算机同一优盘记录,怎么查看电脑插过U盘的记录
  16. Codeforces Round #548 (Div. 2) C. Edgy Trees(思维+dfs)
  17. Python Selenium 字节校招实习岗筛选
  18. 关于向数据库中插入数据时报“An explicit value for the identity column in table can only be specified when ...“的错误
  19. cocos2dx系列--颜色混合BlendFunc
  20. 这类注解都不知道,还好意思说用过Spring Boot?

热门文章

  1. SuperSocket与Netty之实现protobuf协议,包括服务端和客户端
  2. 程序员欢呼:微软Bing开始支持搜索源码、可直接运行
  3. PHP开发中保证接口安全
  4. 【QGIS入门实战精品教程】9.1:QGIS构建泰森多边形(Thiessen Polygon)实例精解
  5. 【ArcGIS Pro微课1000例】0014:两种坐标系全国1km分辨率DEM下载地址(WGS84+Albers投影)
  6. 链表之单、双链表反序
  7. 小程序获取头像试试水 02《 程序员变现指南之 微信QQ 小程序 真的零基础开发宝典》
  8. 三、界面介绍(IVX快速手册)
  9. 如何把照片正面变成反面_没有锁边机如何做衣服(五种方法)
  10. js 月份加6个月_美国切削工具6月份订单较上月增加10.1