Kotlin入门-必会,接口

本文介绍了Kotlin中的接口特性,包括如何定义接口、接口中的属性、接口实现、接口继承以及如何解决覆盖冲突。Kotlin的接口允许更清晰地描述每个接口类的功能,并强调了子类在实现接口时需要明确理解的内容。此外,还提到Kotlin解决了在实现多个接口时可能出现的同名方法冲突问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

前言

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解决了实现多个接口时,继承多个同名实现的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值