Kotlin入门-必会,接口

在这里插入图片描述

前言

Kotlin的继承基本上跟java的类似。

Kotlin强化了接口实现接口的逻辑。可以更清晰的呈现 每个接口类的描述。

除了文字版本,也有Xmind版本 github地址


定义

使用 interface 定义
范例

interface MyInterface {
    fun bar()    // 未实现
    fun foo() {  //已实现
      // 可选的方法体
      println("foo")
    }
}

接口中的属性

只能是抽象的,不允许初始化值。
在接口中声明的属性

  • 要么是抽象的
  • 要么提供访问器的实现

在接口中声明的属性不能有幕后字段(backing field)
实现接口时,必须重写属性。
范例

interface MyInterface {
    val prop: Int // 抽象的

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}

与java不同

  • java中可以定义 变量
  • 被继承后,可以 使用这些变量

接口实现

与java一样,在Kotlin中,类也可以实现多个interface

interface A {
    fun foo() { print("A") }   // 已实现
    fun bar()                  // 未实现,没有方法体,是抽象的
}
 
interface B {
    fun foo() { print("B") }   // 已实现
    fun bar() { print("bar") } // 已实现
}
 
class C : A {
    override fun bar() { print("bar") }   // 重写
}
 
class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }
 
    override fun bar() {
        super<B>.bar()
    }
}

在Kotlin中,重写必须要标明override。其实,在java也需要标记。这是早些年,不标记override也不报错。


接口继承

在Kotlin中,接口可以实现接口。

  • 既提供基类型成员的实现
  • 也声明新的函数与属性
    范例
interface Named {
    val name: String
}

interface Person : Named {
    val firstName: String
    val lastName: String
    
    override val name: String get() = "$firstName $lastName"
}

data class Employee(
    // 不必实现“name”
    override val firstName: String,
    override val lastName: String,
    val position: Position
) : Person

解决覆盖冲突

实现多个接口时,可能会遇到同一方法继承多个实现的问题.
这里从简说。在之前的文章中有提及

interface A {
    fun foo() { print("A") }
    fun bar()
}

interface B {
    fun foo() { print("B") }
    fun bar() { print("bar") }
}

class C : A {
    override fun bar() { print("bar") }
}

class D : A, B {
    override fun foo() {
        super<A>.foo()   ///注意看这里
        super<B>.foo()   ///注意看这里
    }

    override fun bar() {
        super<B>.bar()   ///注意看这里
    }
}

遇到同一方法,继承多个实现,那就需要明确标明!


小结

Kotlin接口继承的做法,强调了,实现接口的子类需要了解的东西。而被实现的接口的父类部分则隐藏了。

Kotlin解决了实现多个接口时,继承多个同名实现的问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章