Kotlin -- 接口(Interface)
Kotlin – 接口(Interface)
interface用于声明一个接口类:
interface Speakable{ fun say() }
然后通过:来实现接口,顺带说一下,在kotlin中,:是一个很强大的符号,对应于Java的implements、extends都是用:来实现:
class Bob : Speakable { override fun say() = println("Hi, Im Bob.") }
正如你所见,在kotlin中override对应的是Java的@override。 在Kotlin中,接口类的方法还可以有默认的行为(在Java中这个特性直到Java8才支持,而且需要用到default关键字):
interface Speakable{ //常规方法声明 fun say() //带有默认行为的方法 fun sing() = println("Take me to your heart Take me to your soul") }
当然,带有默认行为方法的接口也可以在其实现中重新覆写其方法。 让我们再来声明另外一个接口,并且两个接口都对其进行实现:
interface Speakable{ fun say() fun sing() = println("Take me to your heart Take 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, Im 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中重写相关方法。