Kotlin学习笔记(六)【接口】

Kotlin接口

Kotlin接口与java8类似,以interface为关键字,允许方法有默认实现

interface Person {

    fun speak() //接口的方法默认是open

    fun breathe() { //给接口提供默认实现
        println("breathe air")
    }
}

实现接口

个类或者对象可以实现一个或多个接口。

class Chinese: Person {
    override fun speak() {//这个方法由于没有提供默认实现,所以这里必须实现
    }
    override fun breathe() {//接口提供了默认实现,可选择实现该方法
        super.breathe()
    }
}

实例:

fun main(args: Array<String>) {
    val ch = Chinese()
    ch.speak()
    ch.breathe()
}


interface Person {
    fun speak() //接口的方法默认是open

    fun breathe() { //给接口提供默认实现
        println("breathe air")
    }
}

class Chinese: Person {
    override fun speak() {//这个方法由于没有提供默认实现,所以这里必须实现
        println("speak chinese")
    }

    override fun breathe() {//接口提供了默认实现,可选择实现该方法
        super.breathe()
    }
}

输出结果为:

speak chinese
breathe air

接口中的属性

接口中的属性只能是抽象的,不允许初始化值,接口不会保存属性值,实现接口时,必须重写属性:

interface Person {
    var language: String
}

class Chinese(override var language: String) : Person {

}

或者

interface Person {
    var language: String
}

class Chinese : Person {
    override var language: String = "中文"
}

实例:

fun main(args: Array<String>) {
    val ch = Chinese()
    ch.speak()
    ch.breathe()
}


interface Person {
    var language: String

    fun speak() //接口的方法默认是open

    fun breathe() { //给接口提供默认实现
        println("breathe air")
    }
}

class Chinese: Person {
    override var language: String
        get() = "中文"
        set(value) {}

    override fun speak() {//这个方法由于没有提供默认实现,所以这里必须实现
        println("speak $language")
    }

    override fun breathe() {//接口提供了默认实现,可选择实现该方法
        super.breathe()
    }
}

输出为:

speak 中文
breathe air

函数重写

实现多个接口时,可能会遇到同一方法继承多个实现的问题。例如:

fun main(args: Array<String>) {
    val ch = Chinese()
    ch.speak()
    ch.breathe()
}


interface Person {
    var language: String

    fun speak() //接口的方法默认是open

    fun breathe() { //给接口提供默认实现
        println("Person breathe air")
    }
}

interface Man {

    fun speak() //接口的方法默认是open

    fun breathe() { //给接口提供默认实现
        println("Man breathe air")
    }
}

class Chinese: Person, Man{
    override var language: String
        get() = "中文"
        set(value) {}

    override fun speak() {//这个方法由于没有提供默认实现,所以这里必须实现
        println("speak $language")
    }

    override fun breathe() {//接口提供了默认实现,可选择实现该方法,规范来说需要分别实现父类的同名方法
        super<Person>.breathe()
        super<Man>.breathe()
    }
}

输出为:

speak 中文
Person breathe air
Man breathe air

实例中,PersonMan都定义了breathe()speak()方法,这两个接口都实现了方法breathe(),因为Chinese继承于PersonMan所以需要实现这两个接口定义的抽象方法speack(),这个没有疑问。
然而,当我们从PersonMan派生Chinese的时候需要实现PersonMan中的所有抽象方法,当遇到同名方法的时候,原则上我们需要分别调用对应的super规范流程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值