Kotlin – 接口(Interface)
interface
用于声明一个接口类:
interface Speakable{
fun say()
}
然后通过:
来实现接口,顺带说一下,在kotlin中,:
是一个很强大的符号,对应于Java的implements
、extends
都是用:
来实现:
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
你可以在Bob
的sing()
方法指定具体实现哪个接口的sing()
方法,可以两个默认方法都实现、或者只实现其中一个方法,也可以重新编写自己的实现。如果只实现其中一个接口的方法,你可以这样写override fun sing() = super<Speakable>.sing()
因为Kotlin 1.0 是基于Java6设计的,而Java6并不支持接口类的方法拥有默认行为,所以当你在Java中使用带有Kotlin的这一特性的Kotlin类时,你不得不再次手动在Java中重写相关方法。