在做实验二的时候开始使用接口来进行编程,但是没有系统的总结过关于接口的用法的知识,最近趁着期末复习,将接口在编程时的使用的知识做一个总结,同时,检查一下对于知识的理解程度和思考。
接口
接口(interface)是Java中一种表示抽象数据类型的方法,接口内部是一连串的方法标识,但是没有定义。要使用接口就要用一个类来实现接口,在类的内部提供接口中所有方法的定义。
这种做法的⼀个优点就是接⼝只为使⽤者提供“契约”(contract),⽽使⽤者只需要读懂这个接⼝即可使⽤该ADT,他也不需要依赖ADT特定的实现/表⽰,因为实例化的变量不能放在接⼝中(具体实现被分离在另外的类中)。
接⼝的另⼀个优点就是它允许了⼀种抽象类型能够有多种实现/表⽰,即⼀个接⼝可以有多个实现类。Java的静态检查会发现没有实现接⼝的错误,例如,如果程序员忘记实现接⼝中的某⼀个⽅法或者返回了⼀个错误的类型,编译器就会在编译期报错。
子类型
“B是A的⼦类型”就意味着“每⼀个B都是A”,换句话说,“每⼀个B都满⾜了A的规格说明”。这也意味着B的规格说明⾄少强于A的规格说明。当我们声明⼀个接⼝的实现类时,编译器会尝试做这样的检查:
它会检查类是否全部实现了接⼝中规定的函数,并且检查这些函数的标识是否对的上。
但是编译器不会检查我们是否通过其他形式弱化了规格说明:例如强化了某个⽅法输⼊的前置条件,或弱化了接⼝。对于⽤户的保证(后置条件)。如果你在Java中定义了⼀个⼦类型,你必须要确保⼦类型的规格说明⾄少要⽐⽗类型强。
我们为矩形定义⼀个接⼝:
⽽每⼀个正⽅形类型都是矩形类型:
Mutable shapes
而对于一个可变的矩形
正方形:
对于下⾯的MutableSquare.setSize(..) 实现
正方形不是矩形类型的,因为正方形有更强的前置条件。
正方形不是矩形类型的,正方形有更弱的后置条件。