原文: https://beginnersbook.com/2019/03/kotlin-interfaces/

在本指南中,我们将了解接口。与抽象类类似,无法实例化接口,因为它没有任何构造函数。

注意事项:

  1. 接口可以同时具有抽象和非抽象函数。
  2. 接口只能有抽象属性(数据成员),不允许非抽象属性。
  3. 一个类可以实现多个接口。
  4. 接口的所有抽象属性和抽象成员函数必须在实现它的类中重写。

Kotlin 接口示例

在下面的例子中,我们有一个接口MyInterface,它包含一个非抽象方法func和抽象属性str和抽象函数demo

  1. interface MyInterface{
  2. var str: String
  3. fun demo()
  4. fun func(){
  5. println("Hello")
  6. }
  7. }
  8. class MyClass: MyInterface{
  9. override var str: String = "BeginnersBook.com"
  10. override fun demo() {
  11. println("demo function")
  12. }
  13. }
  14. fun main(args: Array<String>) {
  15. val obj = MyClass()
  16. obj.demo()
  17. obj.func()
  18. println(obj.str)
  19. }

输出:

Kotlin 接口 - 图1

Kotlin - 实现多个接口

在以下示例中,我们有两个接口XY。类MyClass实现了接口XY。该类为接口XY的抽象方法提供了实现。

  1. interface X {
  2. fun demoX() {
  3. println("demoX function")
  4. }
  5. fun funcX()
  6. }
  7. interface Y {
  8. fun demoY() {
  9. println("demoY function")
  10. }
  11. fun funcY()
  12. }
  13. // This class implements X and Y interfaces
  14. class MyClass: X, Y {
  15. override fun funcX() {
  16. println("Hello")
  17. }
  18. override fun funcY() {
  19. println("Hi")
  20. }
  21. }
  22. fun main(args: Array<String>) {
  23. val obj = MyClass()
  24. obj.demoX()
  25. obj.demoY()
  26. obj.funcX()
  27. obj.funcY()
  28. }

输出:

Kotlin 接口 - 图2

当多个接口具有相同的方法名称时

在下面的例子中,我们有两个接口XY,但这两个接口都具有相同的函数demo()。类MyClass实现了这两个接口,现在当我们尝试使用类的对象调用这个函数demo()时,我们将得到编译错误,因为编译器混淆了调用哪个方法。

  1. interface X {
  2. fun demo() {
  3. println("demoX function")
  4. }
  5. }
  6. interface Y {
  7. fun demo() {
  8. println("demoY function")
  9. }
  10. }
  11. // This class implements X and Y interfaces
  12. class MyClass: X, Y
  13. fun main(args: Array<String>) {
  14. val obj = MyClass()
  15. obj.demo()
  16. }

如何解决相同方法名称的冲突

为了解决上述冲突,我们覆盖了类中的方法,该方法之前导致了冲突。在覆盖方法中,我们使用super关键字确切地指定了要调用的方法。在下面的例子中,我们想调用接口Ydemo()方法,因此我们在覆盖方法中指定了super<Y>.demo()

  1. interface X {
  2. fun demo() {
  3. println("demoX function")
  4. }
  5. }
  6. interface Y {
  7. fun demo() {
  8. println("demoY function")
  9. }
  10. }
  11. // This class implements X and Y interfaces
  12. class MyClass: X, Y{
  13. override fun demo() {
  14. super<Y>.demo()
  15. }
  16. }
  17. fun main(args: Array<String>) {
  18. val obj = MyClass()
  19. obj.demo()
  20. }

输出:

  1. demoY function