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)}" }