抽象数据类型

Java基础知识:

如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法:

class Person {
    public abstract void run();
}

把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的,所以,Person类也无法被实例化。编译器会告诉我们,无法编译Person类,因为它包含抽象方法。

必须把Person类本身也声明为abstract,才能正确编译它:

abstract class Person {
    public abstract void run();
}

抽象类

如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。

因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。

使用abstract修饰的类就是抽象类。我们无法实例化一个抽象类:

Person p = new Person(); // 编译错误

无法实例化的抽象类有什么用?

因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。

例如,Person类定义了抽象方法run(),那么,在实现子类Student的时候,就必须覆写run()方法:

public class Main {
    public static void main(String[] args) {
        Person p = new Student();
        p.run();
    }
}

abstract class Person {
    public abstract void run();
}

class Student extends Person {
    @Override
    public void run() {
        System.out.println("Student.run");
    }
}
 

ADT 的特性:表示泄漏、抽象函数 AF 、表示不变量 RI

 

基于数学的形式对 ADT 的这些核心特征进行描述并应用于设计中

ADT是由操作定义的,与其内部实现无关

ADT四种操作类型
构造器(Creator):创建一个该类型的新对象(可能实现为构造函数或静态函数)
生产器(Producer):从一个类型的旧对象创建一个新对象(如String中concat方法)
观察器(Observer):返回一个不同类型的对象(如List中的size方法)
变值器(Mutator):改变对象属性的方法(如List中的add方法)


如果一个构造器是用静态方法来实现的,通常称为工厂方法 (factory method):如Java中String类的String.valueOf(Object obj)方法

Mutators通常返回void,但也可以返回非空类型,如Set.add()返回的类型为boolean

immutable类型的ADT无变值器(Mutator)

判断是哪种操作类型,首先需要确定是mutable还是immutable

注:Collections.unmodifiableList() 是 producer; 如果一个方法既改变了对象属性,也返回了不同类型的对象,它是变值器Mutator

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

*不变性(Invariants)
由ADT来负责其不变量,与client端的任何行为无关

表示泄露出现情况:

public 类型的数据 -> private final
mutable 类型共享引用
不应该包含mutate方法
当复制代价很高时,可在规约中强加条件(但是不推荐!)

*Rep Invariant and Abstraction Function(RI and AF)
R : 表示空间 A:抽象空间(ADT开发者关注表示空间R,client关注抽象空间A)

R -> A 的映射:1. 满射:所有抽象值都要有一个rep value 2. 未必单射:一个抽象值可能有多个表示 3. 未必双射:不是所有的表示值都有对应的抽象值

抽象函数(AF):R和A之间映射关系的函数

表示不变性 RI:某个具体的“表示”是否是“合法的”(R -> boolean)

在ADT的规约里若出现"值",也只能是A空间的"值"

有益的可变性(Beneficent mutation)

即immutable的属性是可变的,但是要保证用户角度是一样的

例如:[1, 2] 和 [2, 4]在A空间可均表示1/2
可用ADT的不变量来代替前置条件(相当于将复杂的precondition封装到了ADT内部)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值