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

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

接口

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

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

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

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

实现接口

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

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

接口中的属性

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

interface MyInterface {// 抽象属性。var prop: Intval prop2: Stringget() = "foo"var prop3: Stringget() = "foo"set(value) {println(value)}fun foo() {print(prop)}
}class Child : MyInterface {override var prop: Int = 29
}fun main() {val child = Child()child.prop = 10child.prop3 = "aaa" // aaa
}

接口继承

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

interface Named {val name: String
}interface Person : Named {val firstName: Stringval lastName: Stringoverride 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())。

http://www.lryc.cn/news/537007.html

相关文章:

  • 渗透测试工具:SQLmap安装教程及使用
  • 4.SpringSecurity在分布式环境下的使用
  • RocketMQ和Kafka如何实现顺序写入和顺序消费?
  • SQL联合查询
  • deepseek:三个月备考高级系统架构师
  • 支持向量机原理
  • DeepSeek人工智能AI汽车营销销售培训讲师培训师唐兴通讲课汽车销售大数据存量客户数字化营销数字化销售大模型销售话术引流内容社群私域
  • Molecular Communication(分子通信)与 Molecular Semantic Communication(分子语义通信)
  • Webpack代码分割、分割策略性能优化详解
  • 大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法|文献速递-医学影像人工智能进展
  • ArcGIS Pro显示缓存空间不足导致编辑或加载数据显示不完全
  • 天童美语:观察你的生活
  • 网络通信的基石:深入理解 TCP/IP 协议栈与 TCP/UDP 协议
  • 数据结构-栈和队列的应用
  • SpringBoot Bug 日志
  • halo发布文章的插件问题分析
  • 2.5 模块化迁移策略:从传统项目到模块化系统
  • java商城解决方案
  • 算法-哈希表篇05-四数相加II
  • WPS或word接入智能AI
  • Leetcode:学习记录
  • 86.在 Vue 3 中使用 OpenLayers 自定义组件(放大、缩小、长度测量、面积测量)
  • http 与 https 的区别?
  • SAIL-RK3576单板运行7b的deepseek对话模型
  • 独立C++ asio库实现的UDP Server
  • SQL Server STUFF 函数的用法及应用场景
  • MongoDB进阶篇-索引
  • 《机器学习数学基础》补充资料:柯西—施瓦茨不等式以及相关证明
  • VisionPro 划痕检测小练习
  • 解析 2025 工业边缘计算:三大技术风向的影响力