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