Kotlin系列之接口中的属性

今天我们看看如何让在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更加灵活。

阅读更多

扫码向博主提问

codekongs

夫唯不争,故莫能与之争。
  • 擅长领域:
  • Android
  • Java
  • Kotlin
  • 情感
  • 心理学
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingjianIT/article/details/79452740
文章标签: Kotlin 接口 属性
个人分类: Kotlin
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭