软件构造复习(三)

目录

前言

一、ADT相关介绍

1、ADT的基本概念

2.如何设计好的ADT:

3.RI、AF、rep

4.设计一个ADT的步骤

5.checkRep()

6.其他

二.final关键字

三.方法的重写与重载

总结


前言

继续复习软件构造

一、ADT相关介绍

1、ADT的基本概念

ADT特性:表示泄露,表示不变量,抽象函数

抽象类型:强调“作用于数据上的操作”,程序员和client无需关心数据如何具体存储的,只需设计/使用操作即可。

可变数据类型的对象:提供了可以改变内部数据的值的操作

不可变数据类型的对象:其操作不改变内部数值,而是创建了一个新的对象

构造器creator:新建一个此类型的对象可能实现为构造函数或静态函数

生产器producer:从此类型的旧的object中新建一个新的object

观察器observer:用此抽象类的一个object返回一个其它类型的object

变值器mutator:改变对象属性的方法通常返回为void(也可能返回非空类型),改变对象某些内部状态

2.如何设计好的ADT:

设计一个好的需要以下几个方面

1)规约设计简洁、一致

2)支持client对数据的所有操作、而且用操作满足client需要的难度要低

3)要么抽象、要么具体

3.RI、AF、rep

RI:表示空间R的一个子集,即”合法“的那些表示值,只有这些值才可以通过AF映射到空间A中。

AF:解释每个合法的Rep如何映射到抽象空间中的值。

表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。

RI的定义类型:采用private final的形式进行定义

由此可知当我们需要返回某个可变类型的参数时,不要直接返回,而是进行防御式拷贝。

ADT开发者关注表示空间R,client关注抽象空间A

AF:满射、未必单射、未必双射(R中的部分值并非合法,在A中无映射值)

选择某种特定的表示方式R,进而指定某个子集是“合法”的(Rl),并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值。

即使同样的R、RI,也可能有不同的AF,即解释不同。

4.设计一个ADT的步骤

1)选择R、A

2)确定RI---合法的表示值

3)解释合法的表示值---映射AF

5.checkRep()

checkRep():随时检查RI是否满足,所有可能改变rep的方法内部都要检查,尽管观察器可以不用,但是为了防止万一,建议也要检查。

6.其他

对immutable的ADT来说,它在A空间的abstract value应是不变的。但其内部表示的R空间中的取值则可以是变化的

ADT的规约里只能使用client可见的内容来撰写,包括参数、返回值、异常等。如果规约里 需要提及“值”,只能使用A空间中的“值”。ADT里不能谈及任何内部表示的细节。在代码中以注释的形式写出AF和RI而不能在Javadoc文档中,防止被外部看到而破坏表示独立性/信息隐藏。用ADT不变量取代复杂的 Precondition,相当于将复杂的precondition封装到了ADT内部。

二.final关键字

final表示最终的意思,它修饰的类是不能被继承的;final修饰的方法能被继承(Math类里就有),但是不能够被重写。其实关系并不复杂,你只需要记住这样一句话:final可用于声明属性、方法和类,分别表示属性不可变,方法不可重写,类不可继承。当然final修饰的方法是可以被重载的。

三.方法的重写与重载

关于方法重写的一些特性(静态检查):

  1. 发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
  2. 子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
  3. 子类重写父类方法的返回值类型不能大于父类方法的返回值类型,即是说子类方法的返回值必须和父类方法的返回值相同或是其子类。
  4. 构造方法不能被重写。
  5. 如果不能继承一个类,则不能重写该类的方法。
  6. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
  7. 父类的成员方法只能被它的子类重写。
  8. 声明为 final 的方法不能被重写。
  9. 声明为 static 的方法不能被重写,但是能够被再次声明。

关于方法重载的一些特性(动态检查):

  1. 被重载的方法必须改变参数列表(参数个数或类型或者顺序不一样);
  2. 被重载的方法可以改变返回类型;
  3. 被重载的方法可以改变访问修饰符;
  4. 被重载的方法可以声明新的或更广的检查异常;
  5. 方法能够在同一个类中或者在一个子类中被重载。
  6. 无法以返回值类型作为重载函数的区分标准。


总结

本文简要介绍了ADT的相关知识,方法的重载、重写以及final关键字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值