接口可以包含抽象方法和普通方法。与抽象类的不同之处在于接口不能存储状态。它们可以拥有属性,但这些属性需要是抽象的或定义访问器
使用关键字interface
来定义接口
kotlin
interface MyInterface {
fun bar() // 抽象方法
fun foo() { // 普通方法
// 方法实现
}
}
实现接口
一个类或者对象可以实现多个接口
kotlin
class Child : MyInterface {
override fun bar() {
// 方法实现
}
}
接口属性
抽象属性或者带有访问器的属性
kotlin
interface MyInterface {
val prop: Int // 抽象
val propertyWithImplementation: String // 带访问器
get() = "foo"
fun foo() {
print(prop)
}
}
class Child : MyInterface {
override val prop: Int = 29
}
继承接口
kotlin
interface Named {
val name: String
val age : Int
}
interface Person : Named { // 继承Named
val firstName: String
val lastName: String
override val name: String get() = "$firstName $lastName" // 重写name属性
}
data class Employee(
override val firstName: String, // 重写firstName属性
override val lastName: String, // 重写lastName属性
override val age: Int // 重写age属性
) : Person // 实现Person
重写冲突
当多个父类有相同名称和参数的方法时
kotlin
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()
}
override fun bar() {
super<B>.bar()
}
}
对于类D
必须要重写foo()
和bar
方法,否则在使用时不知道到底要调用A
还是B
的方法