本文翻译自官方文档Interfaces-接口
附加总结了一些知识点。翻译如有错误和纰漏,欢迎指正。
1-知识点汇总
1、接口使用interface
关键字定义。
2、类或者对象可以实现一个或者多个接口
3、接口中的属性该如何定义?
- 抽象属性,用
abstract
定义。- 或者提供访问器的实现
4、接口中的属性的注意点:
- 接口中的属性不能有backing fields。
- 接口中的getter/setter不能引用接口中的属性。
5、接口中重载时的冲突
类C实现接口A,接口B,A和B中有同名方法fun(),此时C必须要重载fun()方法。
2-正文
Kotlin中的接口与Java8中非常相似。它们包含抽象方法的声明以及方法的实现。接口和抽象类最大的不同在于接口不能存储状态(数据)。接口可以有属性但是这些属性需要是抽象属性或者提供了getter/setter的实现。
接口使用关键字interface
定义:
nterface MyInterface {
fun bar()
fun foo() {
//主体可选
}
}
1-实现接口
类或者对象可以实现一个或者多个接口:
class Child : MyInterface {
override fun bar() {
// 主体
}
}
2-接口中的属性
你可以在接口中声明属性。这些属性必须要是抽象(abstract)的或者必须提供访问器的实现。接口中的属性不具有后台区域
,因此在接口中声明的访问器不能引用它们。
interface MyInterface {
val prop: Int // 抽象
val propertyWithImplementation: String
get() = "foo" //具有访问器
fun foo() {
print(prop)
}
}
//实现接口
class Child : MyInterface {
override val prop: Int = 29
}
3-解决冲突
如果在实现的多个接口中都由同名成员:
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()
}
}
因为A,B接口有同名成员,所以在D类中必须显式实现这些同名方法。如果想调用这些方法在接口中的实现,必须要指明是那个接口的方法:super<A>.foo()
——表明调用借口A的foo
方法