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

Kotlin 接口

Kotlin 的接口可既包含抽象方法的声明也包含实现;接口法保存状态有属性必须声明为抽象或提供访问器实现

1、定义

使用关键字 interface 来定义接口

interface MyInterface {fun bar()fun foo() {// 可选的方法体}
}
2、 实现接口

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

class Child : MyInterface {override fun bar() {// 方法体}
}
3、接口中的属性

在接口中定义属性,该属性要么是抽象的,要么提供访问器的实现,且不能有幕后字段(backing field)

interface MyInterface {val prop: Int // 抽象的val propertyWithImplementation: Stringget() = "foo"fun foo() {print(prop)}
}class Child : MyInterface {override val prop: Int = 29
}
4、接口继承

一个接口可以从其他接口派生,意味着既能提供基类型成员的实现也能声明新的函数与属性;实现这样接口的类只需定义所缺少的实现

interface Named {val name: String
}interface Person : Named {val firstName: Stringval lastName: Stringoverride val name: String get() = "$firstName $lastName"
}data class Employee(// 不必实现“name”override val firstName: String,override val lastName: String,val position: Position
) : Person
5、覆盖冲突解决

实现多个接口时,可能会遇到同一方法继承多个实现的问题,需要实现从多个接口继承的所有方法,并指明继承类如何实现它们

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") } // 必须重写A的bar()
}// 需要实现多个接口继承的所有方法 foo() bar()
class D : A, B {override fun foo() {super<A>.foo()super<B>.foo()}override fun bar() {super<B>.bar()}
}
6、函数式接口

一个抽象方法的接口 单一抽象方法接口,以有多个非抽象成员,但能有一个抽象成员

使用 fun 修饰符声明一个函数式接口

fun interface KRunnable {fun invoke()
}

 SAM 转换

对于函数式接口,可以通过 lambda表达式实现 SAM 转换,从而使代码更简洁、更有可读性

fun interface IntPredicate {fun accept(i: Int): Boolean
}
// 不使用 SAM 转换
// 创建一个类的实例
val isEven = object : IntPredicate {override fun accept(i: Int): Boolean {return i % 2 == 0}
}
// 利用 Kotlin 的 SAM 转换
// 通过 lambda 表达式创建一个实例
val isEven = IntPredicate { it % 2 == 0 }

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

相关文章:

  • Qt前端技术:5.QSS
  • 在Centos7中利用Shell脚本:实现MySQL的数据备份
  • 大一C语言查缺补漏 12.24
  • 程序员宝典:常用的免费好物API
  • 关于“Python”的核心知识点整理大全41
  • java进阶(二)-java小干货
  • layui(iconPickerFa)图标选择器插件,主要用于后台菜单图标管理
  • RabbitMQ入门指南(九):消费者可靠性
  • MySQL的聚合函数、MySQL的联合查询、MySQL的左连接右连接内连接
  • RKNN Toolkit Lite2 一键安装和测试,sh脚本
  • 探索中国制造API接口:解锁无限商机,引领制造业数字化转型
  • CentOS上安装MySQL 8.0的详细教程
  • [RISCV] 为android14添加一个新的riscv device
  • 【Fastadmin】通用排序weigh不执行model模型的事件
  • logstash收集华为、H3C、Cisco交换机日志
  • 云上荆楚丨云轴科技ZStack成功实践精选(湖北)
  • C语言字符串处理提取时间(ffmpeg返回的时间字符串)
  • NC(65)元数据增加字段
  • SParC数据集介绍
  • OpenGL 绘制Mesh数据(Qt)
  • 9.传统的轨道画线算法()
  • F (1164) : B DS二叉排序树_有效的二叉排序树
  • 结合el-upload修改支持上传图片、视频并预览
  • 1.SQL - 概述
  • GaussDB数据库表创建行访问控制策略
  • 提升设备巡检效率的关键:易点易动设备管理系统的应用
  • 【C++】STL 容器 - list 双向链表容器 ① ( 容器特点 | 容器操作时间复杂度 | 构造函数 )
  • [C/C++]数据结构 希尔排序
  • SQL进阶:子查询
  • 5、IDEA集成Git