Kotlin 第八章:接口
Kotlin 的接口很像 java 8。它们都可以包含抽象方法,以及方法的实现。和抽象类不同的是,接口不能保存状态。可以有属性但必须是抽象的,或者提供访问器的实现。
接口用关键字 interface
来定义:
interface MyInterface {
fun bar()
fun foo() {
//函数体是可选的
}
}
接口的实现
一个类或对象可以实现一个或多个接口
class Child : MyInterface {
fun bar () {
//函数体
}
}
接口中的属性
可以在接口中申明属性。接口中的属性要么是抽象的,要么提供访问器的实现。接口属性不可以有后备字段。而且访问器不可以引用它们。
interface MyInterface {
val property: Int // abstract
val propertyWithImplementation: String
get() = "foo"// 提供访问器 getter,可以直接获取 propertyWithImplementation 的值foo
fun foo() {
print(property)
}
}
class Child : MyInterface {
override val property: Int = 29
}
解决重写冲突
当我们在父类中声明了许多类型,有可能出现一个方法的多种实现。比如:
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()
}
}
同类的重写类似,接口也一样,如果父类中声明了许多类型,有可能出现一个方法的多种实现,必须复写这个成员并且提供自己的实现,要使用父类中提供的方法,用 super<Base>
来表示。
A
B
接口都有声明了 foo()
bar()
函数。它们都实现了 foo()
方法,但只有 B
实现了 bar()
, bar()
在 A
中并没有声明它是抽象的,这是因为在接口中如果函数没有函数体,那么默认是抽像的。C
实体类需要重写并实现 bar()
,而 D
类,不用重写 bar()
方法,因为继承的 B
接口已经实现了。由于继承了两个 foo()
的实现,所以用 super<Base>
来区分。
写在最后
其实在 Kotlin 中,接口和在 Java 中的区别并不大,只要阅读学习一下,用不了几分钟就能明白的。好,今天的学习跟到这里了,下一篇文章一起继续学习 Kotlin 的内容。