Kotlin接口
Kotlin接口与java8类似,以interface
为关键字,允许方法有默认实现:
interface Person {
fun speak() //接口的方法默认是open
fun breathe() { //给接口提供默认实现
println("breathe air")
}
}
实现接口
个类或者对象可以实现一个或多个接口。
class Chinese: Person {
override fun speak() {//这个方法由于没有提供默认实现,所以这里必须实现
}
override fun breathe() {//接口提供了默认实现,可选择实现该方法
super.breathe()
}
}
实例:
fun main(args: Array<String>) {
val ch = Chinese()
ch.speak()
ch.breathe()
}
interface Person {
fun speak() //接口的方法默认是open
fun breathe() { //给接口提供默认实现
println("breathe air")
}
}
class Chinese: Person {
override fun speak() {//这个方法由于没有提供默认实现,所以这里必须实现
println("speak chinese")
}
override fun breathe() {//接口提供了默认实现,可选择实现该方法
super.breathe()
}
}
输出结果为:
speak chinese
breathe air
接口中的属性
接口中的属性只能是抽象的,不允许初始化值,接口不会保存属性值,实现接口时,必须重写属性:
interface Person {
var language: String
}
class Chinese(override var language: String) : Person {
}
或者
interface Person {
var language: String
}
class Chinese : Person {
override var language: String = "中文"
}
实例:
fun main(args: Array<String>) {
val ch = Chinese()
ch.speak()
ch.breathe()
}
interface Person {
var language: String
fun speak() //接口的方法默认是open
fun breathe() { //给接口提供默认实现
println("breathe air")
}
}
class Chinese: Person {
override var language: String
get() = "中文"
set(value) {}
override fun speak() {//这个方法由于没有提供默认实现,所以这里必须实现
println("speak $language")
}
override fun breathe() {//接口提供了默认实现,可选择实现该方法
super.breathe()
}
}
输出为:
speak 中文
breathe air
函数重写
实现多个接口时,可能会遇到同一方法继承多个实现的问题。例如:
fun main(args: Array<String>) {
val ch = Chinese()
ch.speak()
ch.breathe()
}
interface Person {
var language: String
fun speak() //接口的方法默认是open
fun breathe() { //给接口提供默认实现
println("Person breathe air")
}
}
interface Man {
fun speak() //接口的方法默认是open
fun breathe() { //给接口提供默认实现
println("Man breathe air")
}
}
class Chinese: Person, Man{
override var language: String
get() = "中文"
set(value) {}
override fun speak() {//这个方法由于没有提供默认实现,所以这里必须实现
println("speak $language")
}
override fun breathe() {//接口提供了默认实现,可选择实现该方法,规范来说需要分别实现父类的同名方法
super<Person>.breathe()
super<Man>.breathe()
}
}
输出为:
speak 中文
Person breathe air
Man breathe air
实例中,Person
跟Man
都定义了breathe()
跟speak()
方法,这两个接口都实现了方法breathe()
,因为Chinese
继承于Person
和Man
所以需要实现这两个接口定义的抽象方法speack()
,这个没有疑问。
然而,当我们从Person
和Man
派生Chinese
的时候需要实现Person
,Man
中的所有抽象方法,当遇到同名方法的时候,原则上我们需要分别调用对应的super
规范流程。