今天我们看看如何让在Kotlin的接口中声明属性。
在前面的文章中我们已经介绍过Kotlin中的接口,这里我们先复习一下,然后再重点说说Kotlin中的接口如何声明属性。
Kotlin中的接口
下面是一段Kotlin中接口声明的代码,帮助大家复习一下。
Kotlin代码
package kt
interface Clickable{
fun click()
fun touch() = println("你触摸了")
}
package kt
class Button: Clickable{
override fun click() {
println("点击了。。。")
touch()
}
}
Kotlin中的接口声明属性
我们前面的文章在介绍接口时只是写了在接口中定义方法,所以我们下面说说如何在接口中声明属性。
我们知道在Java中,接口中的成员变量都是常量,也就是默认的修饰符是public static final
类型的,那么在Kotlin中的规则又是什么样呢?
在Kotlin中,我们在接口中可以包含抽象属性声明
,什么意思呢?也就是接口只需要定义属性,至于怎么给该属性赋值,怎么取该属性的值接口都不管,交给该接口具体的实现类来处理。如下面一样。
Kotlin代码
interface People{
val nickname: String
}
对于上面的接口我们怎么实现呢?我们所谓的实现,其实就是给nickname
这个属性赋值或者是获取这个属性的值。我们先看看第一种实现类。
Kotlin代码
class PrivatePeople(override val nickname: String) : People
上面的代码有以下几点要解释一下:
1 . 使用:
来表示实现一个接口
2 . 由于要给接口中的nickname
属性赋值,所以这里使用了主构造方法
并且使用val
关键字为该实现类声明了一个属性nickname
,换言之就是将初始化该实现类对象的属性赋值给了nickname
属性,再者val
声明的属性默认提供了获取值的方法。
3 . 使用override
关键字表示重写了接口的nickname
属性,这个是强制要求
除了上面使用主构造方法来实现接口的属性这种方法,还有一种在类内部重写的方式,代码如下:
Kotlin代码
class SubPeople(val email: String): People{
override val nickname: String
get() = email.substringBefore("@")
}
fun main(args: Array<String>){
val subPeople = SubPeople("mo@qq.com")
println(subPeople.nickname)
}
上面这种方式是我们实现了接口的nickname
属性并且自定义了getter方法,使可以获取到nickname的值。同样需要注意,这里override
关键字是强制要求。
包含getter和setter的属性
其实在接口中,除了抽象声明属性,我们还可以写包含getter和setter的属性,但是需要注意的是getter和setter不能引用需要保存状态的字段,因为接口是不允许保存状态的,就如下面这样。
Kotlin代码
interface People{
val email: String
val nickname: String
get() = email.substringBefore("@")
}
class PrivatePeople(override val nickname: String, override val email: String) : People
class SubPeople(override val email: String): People{
override val nickname: String
get() = email.substringBefore("@")
}
fun main(args: Array<String>){
val subPeople = SubPeople("mo@qq.com")
println(subPeople.nickname)
}
上面的代码我们为nickname
自定义了getter,这是允许的。
写在最后
这一次我们进一步学习了接口,探讨了在Kotlin中在接口中定义属性的规则,可以看出Kotlin在这一块比Java更加灵活。