发现自己对Kotlin的Interface知识掌握的只是"可以实现它"以及和Java类似的知识点,跟着SOF的KotlinTopics再复习一遍,所以本篇内容基本就是把 这里 的内容翻译一部分自己试过的内容
Interface with default implementations
Kotlin的interface中的方法可以有默认实现,即实现了这个接口的派生类可以不实现这个接口方法直接调用:
interface MyInterface1{
fun withImplementation(){
println("withImplementation() 被调用了")
}
}
class MyClass :MyInterface1
fun main(args: Array<String>) {
MyClass().withImplementation()//编译无报错,运行后控制台输出inteface默认实现方法中的字符串
}
Properties
我们可以在interface定义properties .但是interface不能有状态,我们可以将property定义为abstract或者为其提供默认实现的accessors
interface MyInterface {
val property: Int // abstract
val propertyWithImplementation: String
get() = "foo"//provide accessors
fun foo() {
print(property)
}
}
class Child : MyInterface {
//由于是接口的抽象property,在派生类需要实现
override val property: Int = 3
}
默认实现也对参数的getter,setter生效:
interface MyInterface2 {
val helloWorld
get() = "Hello World!"
}
//接口访问器实现不能使用backing field
interface MyInterface3 {
// 这个属性不能被编译通过
var helloWorld: Int
get() = field
set(value) { field = value }
}
这一段说interface的参数可以有getter和setter没太明白,因为如果是常量val,那可以有getter,但想有变量var却会编译错误,那setter就无法使用,还有待学习
Multiple implementations
interface A {
fun notImplemented()
fun implementedOnlyInA() { print("only A") }
fun implementedInBoth() { print("both, A") }
fun implementedInOne() { print("implemented in A") }
}
interface B {
fun implementedInBoth() { print("both, B") }
fun implementedInOne() // only defined
}
class MyClass2 : A, B {
// 接口声明的方法,没有默认实现需要派生类来完成实现
override fun notImplemented() { print("Normal implementation") }
// implementedOnlyInA()有默认实现,派生类可以不重复实现
// 当我们实现多个有默认实现同名方法的接口时,编译器会疑惑它该使用哪个默认实现,这时我们需要实现这个方法提供自己的实现,我们也可以选择声明使用接口的默认实现
override fun implementedInBoth() {
super<B>.implementedInBoth()
super<A>.implementedInBoth()
//or do your things
}
//一个接口已有该方法的默认实现,我们也可以继续去定义别的方法实现
override fun implementedInOne() {
super<A>.implementedInOne()
print("implementedInOne class implementation")
}
}
网友评论