为了账号安全,请及时绑定邮箱和手机立即绑定

重拾Kotlin(7)-接口

一、接口

1.1、抽象方法与默认方法

Kotlin 中的接口与 Java 8 中的类似,可以包含抽象方法的定义以及非抽象方法的实现,不需要使用 default 关键字来标注有默认实现的非抽象方法,但在实现接口的抽象方法时需要使用 override 进行标注

fun main(args: Array<String>) {
    val view = View()
    view.click()
    view.longClick()
}

class View : Clickable {
    
    override fun click() {
        println("clicked")
    }

}

interface Clickable {
    fun click()
    fun longClick() = println("longClicked")
}

如果一个类实现了多个接口,而接口包含带有默认实现且签名相同的方法,此时编译器就会要求开发者必须显式地实现该方法,可以选择在该方法中调用不同接口的相应实现

class View : Clickable, Clickable2 {

    override fun click() {
        println("clicked")
    }

    override fun longClick() {
        super<Clickable>.longClick()
        super<Clickable2>.longClick()
    }
}

interface Clickable {
    fun click()
    fun longClick() = println("longClicked")
}

interface Clickable2 {
    fun click()
    fun longClick() = println("longClicked2")
}

1.2、抽象属性

接口中可以包含抽象属性声明,接口不定义该抽象属性是应该存储到一个支持字段还是通过 getter 来获取,接口本身并不包含任何状态,因此只有实现这个接口的类在需要的情况下会存储这个值

看以下例子,Button 类和 TextView 类都实现了 Clickable 接口,并都提供了取得 statusValue 值的方式

Button 类提供了一个自定义的 getter 用于在每次访问时重新获取 statusValue 值,因此在多次获取属性值时其值可能都会不一致,因为每次 getRandom() 方法都会被调用

TextView 类中的 statusValue 属性有一个支持字段来存储在类初始化时得到的数据,因此其值在初始化后是不会再次获取值,即 TextView 类中的 getRandom() 只会被调用一次

fun main(args: Array<String>) {
    val button = Button()
    println(button.statusValue)
    val textView = TextView()
    println(textView.statusValue)
}

class Button : Clickable {

    override val statusValue: Int
        get() = getRandom()

    private fun getRandom() = Random().nextInt(10)

}

class TextView : Clickable {

    override val statusValue: Int = getRandom()

    private fun getRandom() = Random().nextInt(10)

}

interface Clickable {

    val statusValue: Int

}

除了可以声明抽象属性外,接口还可以包含具有 getter 和 setter 的属性,只要它们没有引用一个支持字段(支持字段需要在接口中存储状态,而这是不允许的)

interface Clickable {

    val statusValue: Int

    val check: Boolean
        get() = statusValue > 10
    
}

重拾 Kotlin 系列文章目录: 重拾 Kotlin

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消