Kotlin接口
时间:2020-02-23 14:37:31 来源:igfitidea点击:
在本教程中,我们将研究Kotlin中的接口。
Kotlin接口就像合同,类可以将其用于特定行为。
Kotlin接口
Kotlin中的接口包含抽象的函数和属性的定义。
接口可以具有功能的实现。
而且,接口可以通过定义其getter和setter来具有非抽象属性。
但是,接口仍然无法存储状态。
除非类实现了接口,否则它们是无用的。
接口不能有任何构造函数。
定义接口
可以使用关键字"接口"定义Kotlin中的接口。
interface First{
fun stringEcho() : String //abstract function that returns a string
fun printMe(){
println("This function has a body containing the implementation")
}
var str : String //abstract property
val i : Int //abstract property
}
printMe()函数是非抽象的,因为它包含一个实现。
此外,我们还可以声明该属性,只要我们为其设置访问器方法。
interface Second {
val i: Int
get() = 10
var str: String
get() = "You Name"
set(value) {}
}
我们无法在接口中使用属性中的后备字段" field",因为接口不会存储任何状态,因此不会存储任何先前的值。
实施接口
我们定义的上述接口可以在Kotlin类上实现,如下所示。
class A : First {
override var str: String = "str"
get() = "Value is $field"
override val i: Int = 1
override fun stringEcho(): String {
return "Hello"
}
}
我们需要实现接口的所有抽象属性,或者将类设置为"抽象类"。
"覆盖"修饰符从定义的接口覆盖属性/功能。
无需实现非抽象属性/功能。
让我们在main函数中初始化该类。
fun main(args: Array<String>) {
var a = A()
a.printMe()
a.str = "Kotlin Interfaces"
println(a.str)
println(a.stringEcho())
}
覆盖构造函数中的属性
属性也可以作为类的构造函数参数覆盖。
class B(override var str: String, override val i: Int) : First{
override fun stringEcho(): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
实施多个接口
使用上述概念,一个类也可以实现多个接口。
让我们看一个示例,其中两个接口具有如下定义的相同功能。
interface Formal {
fun echoName(username: String): String {
return "Mr. $username"
}
}
interface Informal {
fun echoName(username: String): String {
return username
}
}
在这种情况下,如果我们完全重写了类中的函数实现,则我们的类将具有单个公共的重写实现,如下所示。
class D : Formal, Informal {
override fun echoName(username: String): String {
return username
}
}
如果我们需要从接口访问该功能怎么办?
我们使用关键字" super"。
现在在上面的代码中,使用" super"会产生编译时错误,因为编译器不知道要转到哪个接口。
因此,在Kotlin中,我们需要指定接口以及" super",如下所示。
class D : Formal, Informal {
override fun echoName(username: String): String {
return super<Formal>.echoName(username)
}
}
fun main(args: Array<String>) {
val d = D()
println(d.echoName("Jake Wharton"))
}
//Prints
//Mr. Jake Wharton
另一个例子:
override fun echoName(username: String): String {
return "Formal : ${super<Formal>.echoName(username)}. Informal : ${super<Informal>.echoName(username)}"
}

