学完了函数,就不得不提接口,在Java中,由于只能单继承(extends),很多拓展的功能就必须使用接口来实现。
例如在Android的mvp模式中,需要展示的界面(activity或者fragment)需要的网络数据,一般都是通过实现特定的view来获得从服务器获取的数据。这里的特定view就是一个接口,接口里面可以是抽象的方法或者方法的实现,如果是抽象方法,实现view的地方需要实现view的方法。
接口
在Kotlin中的接口和Java中的类似。接口也是用interface关键字来标识。
关于接口的属性:可以在接口中申明属性。接口中的属性要么是抽象的,要么提供访问器的实现
interface MyInterface {
//抽象的属性
val por: Int
//提供了访问器的实现
val sex: String
get() = "test()"
fun test(): String {
return "man"
}
}
接口的实现
一个类或者对象可以实现多个接口,用于解决Java中的单继承问题。
class MyInterImpl: MyInterface {
override val por: Int
get() = 10
override val sex: String
get() = super.sex
override fun test(): String {
return super.test()
}
}
重写冲突问题
先看一下下面的这一段代码:
interface A {
fun foo() { print("A") }
fun bar()
}
interface B {
fun foo() { print("B") }
fun bar() { print("bar") }
}
class C : A {
override fun bar() { print("bar") }
}
class D : A, B {
override fun foo() {
super<A>.foo()
super<B>.foo()
}
}
这里有两个接口AB,类C实现A,类D实现AB。
先看一下类C,由于A中有一个抽象方法 bar(),所以C中必须重写该方法,而方法foo()不是抽象的,可以不重写。
再看一下类D,它同时实现了AB两个接口,A的bar()方法是抽象的,但是B中的bar()方法不是抽象的,这里的D就不需要再复写bar()方法,因为B接口已经实现了该方法。(文档上是这么说的)
然而!然而!然而!我在试验的时候,代码报错提示:
class'D' must override public abstract fun bar(): Unit defined in com.ckw.zfsoft.testdemo.A because it inherits multiple interface methods of it
说的是D类必须重写bar()方法,所以D类需要这样写:
class D : A, B {
override fun bar() {
}
override fun foo() {
super<A>.foo()
super<B>.foo()
}
}
这个小插曲告诉我们,文档有时候并一定都是对的,有可能是Kotlin升级了之后,有些规则不再适用,所以还是要自己去积极地尝试!
好了,关于接口就学到这里了。