接口是用于实现
多态编程
的的重要组成部分。任何一个类只能继承一个
父类
,但可以实现任意
接口
。就像一个孩子只能有一个父亲,但他可以有很多技能。
我们继续用之前的
Human
和
Student
。我们这里来给
Student
创建
Study
接口,让学生学习起来。新建一个名为
Study
的
interface
。
我们可以在
接口函数
中定义很多
抽象行为
,然后再具体
类
中实现。下面我们定义两个学习行为:
interface Study {fun learnMath()fun learnEnglish()}
有了行为,我们回到
Student.kt
里,为了便于学习接口,更改代码如下:
package com.example.hellowordclass Student(name: String, age: Number): Human(name,age), Study{override fun learnEnglish() {println(name + \"is learning English.\")}override fun learnMath() {println(name + \"is learning Math.\")}}
同时给出
Human.kt
的代码,以防出错:
package com.example.hellowordopen class Human(val name: String,val age: Number) {}
- Kotlin接口统一使用
:
冒号,而有继承也需要用到
:
时,用
,
隔开即可。
-
接口
后面没有括号,因为没有
构造函数
。
- Kotlin中使用
override
来重写
父类
或实现
接口函数
。这是被强制要求的
修饰符
。
-
Study
结构定义了两个函数,
Student
类里必须实现这两个函数。
下面我们在
Student.kt
里执行以下
main
函数:
fun main(){val xiaoming = Student(\"Xiao Ming\", 22)xiaoming.learnEnglish()xiaoming.learnMath()}
我们实例化
Student
类为
xioaming
。并执行了两个接口函数。结果如下:
我们继续修改
Student.kt
里的代码:
fun tuDo(study:Study){study.learnMath()study.learnEnglish()}fun main(){val xiaoming = Student(\"Xiao Ming\", 22)tuDo(xiaoming)}
此段代码为解释
面向接口编程
,也称
多态
。
-
原本我们可直接调用
xiaoming
来实现两个动作,而这里定义一个
tuDo()
函数。
-
tuDo()
函数可接收一个类型为
Study
的参数,因此我们定义的
xiaoming
实例可以传入
TuDor()
函数。
-
在
tuDo()
内我们调用了两个函数。实现效果和上面相同。
大家可能还有个疑问:接口函数里什么也没写,没用啊!当然可以写啦,看下面代码:
interface Study {fun learnMath()fun learnEnglish(){println(\"Do English homework.\")}}
我们定义了
learnEnglish()
的具体动作。这样此函数就有函数体了。有函数体后,函数是默认可用的,不需要去
override
重写的,而你如果重写了,就按你重写的执行了啦。
如果你预先定义的没有函数体,则是必须要
override
重写的哦。
我们将下段代码删除:
override fun learnEnglish() {println(name + \"is learning English.\")}
仍然运行
main
,得到结果:
好啦,我们事先写好的语句出现。有了接口,我们可以少定义很多重复的函数。
可是,我们有的时候只希望一个函数运行在限定的空间内,这就要用到
函数可见性修饰符
。
修饰符有以下四种:
修饰符 | 权限 |
---|---|
public | 所有类可见(默认) |
private | 当前类可见 |
protected | 当前类、子类可见 |
internal | 同一模块中的类可见 |
以上的详细运用,大家在平时实践中即可掌握。
欢迎关注小试编程