接口是用于实现多态编程
的的重要组成部分。任何一个类只能继承一个父类
,但可以实现任意接口
。就像一个孩子只能有一个父亲,但他可以有很多技能。
我们继续用之前的Human
和Student
。我们这里来给Student
创建Study
接口,让学生学习起来。新建一个名为Study
的interface
。
我们可以在接口函数
中定义很多抽象行为
,然后再具体类
中实现。下面我们定义两个学习行为:
interface Study {
fun learnMath()
fun learnEnglish()
}
有了行为,我们回到Student.kt
里,为了便于学习接口,更改代码如下:
package com.example.helloword
class 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.helloword
open 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 | 同一模块中的类可见 |
以上的详细运用,大家在平时实践中即可掌握。
欢迎关注小试编程