当前位置: 首页 > news >正文

Kotlin 2.1.0 入门教程(十七)接口

接口

接口可以包含抽象方法的声明,也可以包含方法的实现。

接口与抽象类的不同之处在于,接口无法存储状态。接口可以拥有属性,但这些属性要么必须是抽象的,要么就得提供访问器的实现。

接口使用 interface 关键字来定义:

interface MyInterface {
    fun bar()
    fun foo() {
      // 可选函数体。
    }
}

实现接口

一个类或对象可以实现一个或多个接口:

class Child : MyInterface {
    override fun bar() {
    }
}

接口中的属性

你可以在接口中声明属性。接口中声明的属性可以是抽象的,也可以为访问器提供实现。接口中声明的属性不能有幕后字段,因此接口中声明的访问器也不能引用它们:

interface MyInterface {
    // 抽象属性。
    var prop: Int

    val prop2: String
        get() = "foo"
    
    var prop3: String
        get() = "foo"
        set(value) {
            println(value)
        }

    fun foo() {
        print(prop)
    }
}

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

fun main() {
    val child = Child()
    child.prop = 10
    child.prop3 = "aaa" // aaa
}

接口继承

一个接口可以从其他接口派生,这意味着它既可以为其他接口的成员提供实现,也可以声明新的函数和属性。很自然地,实现这样一个接口的类只需要定义缺失的实现:

interface Named {
    val name: String
}

interface Person : Named {
    val firstName: String
    val lastName: String

    override val name: String get() = "$firstName $lastName"
}

data class Employee(
    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()
    }
}

接口 AB 都声明了函数 foo()bar()。它们都实现了 foo() 方法,但只有 B 实现了 bar() 方法(A 中的 bar() 没有标记为抽象方法,因为在接口中如果函数没有方法体,默认就是抽象的)。现在,如果你从 A 派生出一个具体类 C,你就必须重写 bar() 方法并提供实现。

然而,如果你从 AB 派生出类 D,你需要实现从多个接口继承来的所有方法,并且需要明确指定 D 应该如何实现这些方法。这条规则既适用于你只继承了一种实现的方法(如 bar()),也适用于你继承了多种实现的方法(如 foo())。
B 派生出类 D,你需要实现从多个接口继承来的所有方法,并且需要明确指定 D 应该如何实现这些方法。这条规则既适用于你只继承了一种实现的方法(如 bar()),也适用于你继承了多种实现的方法(如 foo())。

相关文章:

  • SpringCloud面试题----微服务下为什需要链路追踪系统
  • 2月14(信息差)
  • 【算法工程】解决linux下Aspose.slides提示No usable version of libssl found以及强化推理模型的短板
  • Win7本地化部署deepseek-r1等大模型详解
  • Base64 PDF解析器
  • 大模型为什么离不开PyTorch
  • python使用try-except-else处理异常
  • AndroidStudio查看Sqlite和SharedPreference
  • 利用蓝耘智算平台深度搭建deepseek R1模型,进行深度机器学习
  • git 提示 fatal: The remote end hung up unexpectedly
  • 网络安全 “免疫力”:从人体免疫系统看防御策略
  • Windchill开发-电子仓相关对象信息查询SQL
  • CCF-GESP 等级考试 2024年9月认证C++二级真题解析
  • 《网络编程卷2:进程间通信》第八章:共享内存深度解析与多进程高性能通信实践
  • 【前端OCR】如何用paddlejs开发一个属于前端本地的OCR文本识别功能
  • 江科大51单片机学习笔记(2)
  • 在Linux中Redis不支持lua脚本的处理方法
  • 基于 GEE 计算研究区年均地表温度数据
  • 通过C或C++编程语言实现某一个或多个具体算法
  • AI大模型(DeepSeek)科研应用、论文写作、数据分析与AI绘图学习
  • 网站建设创意公司/宁波关键词网站排名
  • 网页设计做音乐网站/b2b推广网站
  • 贵阳网络网站建设/免费建自己的网址
  • 网站免费建立/湛江百度seo公司
  • 生物医药网站建设/宁波seo排名优化
  • 企业网站建设内容 程序开发/上海热点新闻