Kotlin – 接口(Interface)


  interface用于声明一个接口类:

interface Speakable{
    fun say()
}

  然后通过:来实现接口,顺带说一下,在kotlin中,:是一个很强大的符号,对应于Java的implementsextends都是用:来实现:

class Bob : Speakable {
    override fun say() = println("Hi, I'm Bob.")
}

  正如你所见,在kotlin中override对应的是Java的@override
  在Kotlin中,接口类的方法还可以有默认的行为(在Java中这个特性直到Java8才支持,而且需要用到default关键字):

interface Speakable{
    //常规方法声明
    fun say()
    //带有默认行为的方法
    fun sing() = println("Take me to your heart\nTake me to your soul")
}

  当然,带有默认行为方法的接口也可以在其实现中重新覆写其方法。
  让我们再来声明另外一个接口,并且两个接口都对其进行实现:

interface Speakable{
    fun say()
    fun sing() = println("Take me to your heart\nTake me to your soul")
}

interface Human{
    fun sing() = print("Just Beat It Beat It Beat It Beat It")
}

class Bob : Speakable,Human {
    override fun say() = println("Hi, I'm Bob.")
    override fun sing() {
        super<Speakable>.sing()
        super<Human>.sing()
    }
}

  在这种情况下,他们两个都包含了sing()方法,如果你不指定其具体怎么实现,那你会得到一个报错:

Error:(17, 1) Kotlin: Class 'Bob' must override public open fun sing(): Unit defined in Kt04.Speakable because it inherits multiple interface methods of it

  你可以在Bobsing()方法指定具体实现哪个接口的sing()方法,可以两个默认方法都实现、或者只实现其中一个方法,也可以重新编写自己的实现。如果只实现其中一个接口的方法,你可以这样写override fun sing() = super<Speakable>.sing()
  因为Kotlin 1.0 是基于Java6设计的,而Java6并不支持接口类的方法拥有默认行为,所以当你在Java中使用带有Kotlin的这一特性的Kotlin类时,你不得不再次手动在Java中重写相关方法。