软构笔记-8-ADT和OOP中的“等价性”
软构8
本章大纲:
- 理解特性之间的等价关系
- 站在观察者角度,利用AF,定义不可变对象之间的等价关系
- 引用等价性和对象等价性
- 可变数据类型的观察等价性和行为等价性
- 理解 Object 的契约,正确实现等价关系判定
ADT 的等价操作
-
ADT 是对数据的抽象
-
抽象函数 AF :内部表示
抽象表示
-
基于抽象函数 AF 定义 ADT 的等价操作
不可变数据类型的等价性
- 使用AF来判断
AF映射到同样的结果,则等价 - 通过观察来判断
站在外部观察者角度:对两个对象调用任何相同的操作,都会得到相同的结果,则认为这两个对象是等价的。反之亦然!
== vs. equals()
- == :引用等价性
- equals() :对象等价性
在自定义 ADT 时,需要重写Object的equals()
对基本数据类型,使用 == 判定相等
对对象类型,使用 equals()
public class Object {
...
public boolean equals(Object that) {
return this == that;
}
}
在Object中实现的缺省equals()是在判断引用等价性。
可变数据类型的等价性
两种方法:
- 观察等价性: 在不改变状态的情况下,两个mutable对象是否看起来一致
- 行为等价性: 调用对象的任何方法都展示出一致的结果